现在的位置: 主页 > 商讯 > 文章列表

ASP.NET MVC Model验证(三)

作者:潜江市宏光畜牧有限公司 来源:www.qjhgnm.com 未知发布时间:2017-09-08 21:02:04
ASP.NET MVC Model验证(三) 前言

上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的Model验证是在哪个具体的方法中来执行的,本篇的主题就是模拟一下默认的实现,自定义个Model绑定器继承自DefaultModelBinder类型,并且重写某些个重要的方法。

Model验证

Model验证简单运用示例

ModelValidator使用生成过程

自定义实现DefaultModelBinder进行验证

自定义ModelValidatorProvider 和ModelValidator

ValidationAttribute特性类使用

自定义ValidationAttribute特性类的示例实现

自定义实现DefaultModelBinder进行验证

以下用到的示例正是修改自ASP.NET MVC Model验证(一)篇幅中的示例,这里就不多说什么了,开始直接贴代码。

首先是ViewModel的定义,代码1-1。

代码1-1

复制代码

namespace MvcApplication.Models

{

public class RegistrationInformation

{

public string ID { get; set; }

public string UserID { get; set; }

public string Password1 { get; set; }

public string Password2 { get; set; }

public string Name { get; set; }

}

}

复制代码

控制器的定义,代码1-2:

代码1-2

复制代码

public class ModelValidatorController : Controller

{

public ActionResult Index()

{

return View(new Models.RegistrationInformation());

}

public ActionResult ModelValidator(RegistrationInformation regInfo)

{

return View(regInfo);

}

}

复制代码

控制器方法对应视图定义,代码1-3:

代码1-3-1

Index视图

复制代码

@model MvcApplication.Models.RegistrationInformation

@{

ViewBag.Title = "Index";

}

<h2>Index</h2>

@using (Html.BeginForm("ModelValidator","ModelValidator"))

{

<p>用户注册ID:@Html.EditorFor(m=>m.ID)</p>

<p>用户名:@Html.EditorFor(m=>m.UserID)</p>

<p>登录密码:@Html.EditorFor(m=>m.Password1)</p>

<p>再次输入域密码:@Html.EditorFor(m=>m.Password2)</p>

<p>姓名:@Html.EditorFor(m=>m.Name)</p>

<input type="submit" value="提交" />

}

复制代码

代码1-3-2

ModelValidator视图

复制代码

@model MvcApplication.Models.RegistrationInformation

@{

ViewBag.Title = "ModelValidator";

}

<h2>ModelValidator</h2>

@Html.ValidationSummary(true)

<p>用户注册ID:@Html.EditorFor(m => m.ID)

@Html.ValidationMessageFor(m=>m.ID)

</p>

<p>用户名:@Html.EditorFor(m => m.UserID)

@Html.ValidationMessageFor(m=>m.UserID)</p>

<p>登录密码:@Html.EditorFor(m => m.Password1)

@Html.ValidationMessageFor(m=>m.Password1)

</p>

<p>再次输入域密码:@Html.EditorFor(m => m.Password2)

@Html.ValidationMessageFor(m=>m.Password2)

</p>

<p>姓名:@Html.EditorFor(m=>m.Name)</p>

复制代码

前面所示的就是把示例演示所需的定义好,站群,这个时候运行会发现,只不过是一个页面传值而已,什么都没有发生。现在我们来定义一下自定义的Model绑定器继承自DefaultModelBinder类型。

代码1-4

复制代码

public class MyCustomDefaultModelBinder : DefaultModelBinder

{

protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)

{

base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);

switch (propertyDescriptor.Name)

{

case "ID":

if (string.IsNullOrEmpty((string)value) || (string)value == "")

{

bindingContext.ModelState.AddModelError("ID", "请输入ID,ID不能为空!");

}

break;

case "UserID":

if (string.IsNullOrEmpty((string)value) || (string)value == "")

{

bindingContext.ModelState.AddModelError("UserID", "请输入用户账户,用户账户不能为空!");

}

break;

case "Password1":

if (string.IsNullOrEmpty((string)value) || (string)value == "")

{

bindingContext.ModelState.AddModelError("Password1", "请输入登录密码,登录密码不能为空!");

}

break;

case "Password2":

if (string.IsNullOrEmpty((string)value) || (string)value == "")

{

bindingContext.ModelState.AddModelError("Pssword2", "请再次输入密码,密码不能为空!");

}

break;

case "Name":

break;

}

}

protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)

{

base.OnModelUpdated(controllerContext, bindingContext);

Models.RegistrationInformation regInfo = bindingContext.Model as Models.RegistrationInformation;

if (bindingContext.ModelState["Password1"].Errors.Count == 0 && bindingContext.ModelState["Password2"].Errors.Count == 0)

{

if (regInfo.Password1 != regInfo.Password2)

{

bindingContext.ModelState.AddModelError("Password2", "请重新输入密码,与上次输入密码不同");

}

}

if (string.Compare(regInfo.Name, "jinyuan", true)==0)

{

bindingContext.ModelState.AddModelError("", "您输入的名称违法了,立即更改不然查水表");

}

}

}

复制代码

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:宜昌SEO http://yichang.4567w.com

上一篇:php取得几天星期几以及这个星期的星期一和下周一对应 下一篇:最后一页