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 == && bindingContext.ModelState["Password2"].Errors.Count == )
{
if (regInfo.Password1 != regInfo.Password2)
{
bindingContext.ModelState.AddModelError("Password2", "请重新输入密码,与上次输入密码不同");
}
}
if (string.Compare(regInfo.Name, "jinyuan", true)==)
{
bindingContext.ModelState.AddModelError("", "您输入的名称违法了,立即更改不然查水表");
}
}
}

代码1-4中,我们重写了SetProperty()方法,从上篇的知识中得知,这个方法是在PropertyDescriptor类型的集合中遍历执行的,所以每次进入方法内部的只是个Model属性,而在SetProperty()方法内部的Model验证判断逻辑和ASP.NET MVC Model验证(一)篇幅的一样。

而在OnModelUpdated()方法中,我们首先获取了示例代码1-1中定义的ViewModel类型实例,这里有的朋友可能会问为什么不在SetProperty()方法中也这样使用,而是使用PropertyDescriptor类型的参数来进行验证操作,因为在SetProperty()方法执行的期间并没有对ViewModel完全的赋值,所以不能那样直接获取实例来使用。接着上面的说,在此之后从当前的绑定上下文的ModelState属性中获取判断密码1和密码2是否存在属性验证级的错误信息,没有的话将会对它们进行等值验证,正如上面代码所示的那样,随之验证Name的时候我将错误信息添加的键值为””,这表示默认为Model级验证错误信息。

所需要做的验证都做完了,注册我们的自定义绑定器到系统中,在Global.asax文件的Application_Start()中添加代码1-5.

代码1-5

ModelBinders.Binders.Add(typeof(Models.RegistrationInformation), new Binders.MyCustomDefaultModelBinder());

最后我们看一下效果图,图1表示为起初展示的页面,在我输入一部分的信息过后,点击提交过后页面会跳转到图2,并且执行完验证显示出验证后的错误信息。

图1

图2

大家可以动手试一试,到这里说明了一种验证方式,将在下篇为大家讲解MVC框架提供给我们的正儿八经用来执行验证的类型的一些相关类型,以及一些简单的示例,这样我们就不在使用Model绑定器来执行验证了,看起来绑定器有点不务正业。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC Model验证(三)的更多相关文章

  1. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  2. 详解ASP.NET MVC Model验证

    ASP.NET mvc的最好的优点之一就是支持Model验证,这个特性很方便你可以选择在定义Model的时候在字段中采用特性进行注解约定,也可以在代码中自己进行手动验证.下面就来细说一下ASP.NET ...

  3. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  4. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  5. ASP.NET MVC Model验证(一)

    ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...

  6. ASP.NET MVC Model绑定(三)

    ASP.NET MVC Model绑定(三) 前言 看过前两篇的朋友想必对Model绑定有个大概的了解,然而MVC框架给我们提供了更高的可扩展性的提供程序编程模式,也就是本篇的主题了,会讲解一下Mod ...

  7. ASP.NET MVC Model元数据(三)

    ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...

  8. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    本文属转载,来源: http://www.byywee.com/page/M0/S868/868615.html 关于Model验证官方资料: http://msdn.microsoft.com/zh ...

  9. 【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    转自:http://www.cnblogs.com/easy5weikai/p/3843131.html 关于Model验证官方资料: http://msdn.microsoft.com/zh-cn/ ...

随机推荐

  1. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  2. 2015 西雅图微软总部MVP峰会记录

    2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...

  3. 传播正能量——做一个快乐的程序员

    引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...

  4. C# 发送邮件 附件名称为空

     示例代码: // 1.创建邮件 MailMessage mailMsg = new MailMessage(); mailMsg.To.Add(new MailAddress("test@ ...

  5. 前端常用的WindowsCMD命令

    前面的话   在网上找了一些关于命令提示符CMD的资料,但是很多资料都是把所有的功能罗列出来,大部分都不会用到.所以,自己把常用的CMD命令总结如下,方便查阅 操作类 help 列出所有支持的指令及说 ...

  6. Spring的数据库开发

                                Spring JDBC框架操作mysql数据库 Spring中的JDBC为我们省去连接和关闭数据库的代码,我们着重关注对数据库的操作.Sprin ...

  7. VB.NET设置控件和窗体的显示级别

    前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...

  8. 微信小程序教程汇总

    目前市面上在内测期间出来的一些实战类教程还是很不错的,主要还是去快速学习小程序开发的整体流程,一个组件一个组件的讲的很可能微信小程序一升级,这个组件就变了,事实本就如此,谁让现在是内测呢.我们不怕,下 ...

  9. 【从零开始学BPM,Day4】业务集成

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第四天课程] 1.课程概要 Step 1 软件下载:H3 BP ...

  10. 如何解决流程开发中SheetRadioButtonList页面取值问题

    分享一个常见的取值问题. 应用场景: SheetRadioButtonList控件,点击其中一项执行事件操作.如果是页面加载的情况下,值就无法取到. 具体原因如下: 我给SheetRadioButto ...