zoukankan      html  css  js  c++  java
  • 在ASP.NET MVC Framework中使用IErrorDataInfo接口实现验证(翻的)

    原文地址:http://www.asp.net/learn/mvc/tutorial-37-cs.aspx

    不好意思,翻得有点烂啊。

    本指南的目的是解释另一种在ASP.NET MVC中执行验证的途径。主要阐述如何阻止用户在提交HTML表单填写了一些不合法的内容,以及使用IErrorDataInfo执行验证。

    先做一些假设

    在本指南中,使用了MoviesDB数据库和Movies表,这是列的定义:

    image

    在本指南中,使用了Entity Framework生成数据库模型,这是生成的Movie类:

    image

    Controller类

    使用HomeController显示movie列表以及创建新的movie,这是代码:

    image

    在HomeController中包含两个Create() action,第一个用于显示创建movie所需要的HTML表单,第二个执行插入数据库的操作。第二个Create()方法会在提交表单的时候调用。

    注意第二个Create() action包含这样一些代码:

    image

    当验证出错的时候,IsVaild属性返回false。包含的HTML表单的视图(Create)会被重新显示。

    创建一个部分类

    Movie类是由Entity Framework生成的,如果在解决方案资源管理器中展开MoviesDBModel.edmx文件,可以看到它的代码(MoviesDBModel.Design.cs)。

    image

    Movie类是一个部分类(partial class),就是说可以添加另一个同名的部分类来扩展这个Movie类,我们会把我们的验证逻辑代码添加到部分类中。

    首先添加一个部分类:

    image

    在这个部分类中你增加的任何方法属性都会被作为Entity Framework自动生成的Movie类的一部分。

    增加OnChanging和OnChanged方法

    当Entity Framework生成一个实体类的时候,Entity Framework会自动为类添加partial方法。Entity Framework生成OnChanging和OnChanged部分方法关联到每个属性。

    这个例子中,Entity Framework为Movie类创建这些方法:

    • OnIdChanging
    • OnIdChanged
    • OnTitleChanging
    • OnTitleChanged
    • OnDirectorChanging
    • OnDirectorChanged
    • OnDateReleasedChanging
    • OnDateReleasedChanged

    OnChanging方法在属性改变之前被响应,OnChanged方法在完成属性改变后执行。

    你可以利用partial方法,把验证逻辑添加到Movie类中。图中修改后的Movie类验证Title和Director属性不能为空值。

    注意:类中的部分(partial)方法定义了不需要实现的方法,如果你不实现partial方法,编译器会删除方法签名和该方法的所有调用,所以在部分方法中不会有运行时的性能损失。在Visual Studio代码编辑器中,你可以用关键字partial添加一个部分方法。

    image

    比如说,当你尝试指定一个空值到Title属性的时候,会有一条错误信息被指定到Dictionary对象_errors中 。

    当你指定一个空字符串到Title属性的时候,错误信息会被添加到_error字段中,但不会有任何错误提示,我们需要在ASP.NET MVC Framework中实现IDataErrorInfo接口来显示这些验证错误。

    实现IDataErrorInfo接口

    IDataErrorInfo接口是.NET Framework的一部分,第一版就已经存在了,这是个非常简单的接口:

    image

    如果一个类实现了IDataErrorInfo接口,ASP.NET MVC Framework在创建实例的时候会自动使用这个接口,比如说,HomeController的Create action接受一个Movie实例参数:

    image

    Create action在创建Movie实例的时候,使用了一个模型绑定器(model binder,这里是DefaultModelBinder)。模型绑定器负责通过HTML表单的内容创建Movie对象。

    无论一个类是否实现了IDataErrorInfo接口,DefaultModelBinder会进行检测,如果一个类实现了这个接口,模型绑定器会调用IDataErrorInfo接口方法,如果索引器返回一个错误,模型绑定器会把相应的错误信息自动添加到模型状态中。

    DefaultModelBinder同样会检查IDataErrorInfo.Error属性。这个属性用于表现缺少属性的具体验证错误。比如说,你可能会使用一条验证规则,同时实施到多个属性上,会从Error属性中获得验证错误信息。

    修改后的Movie类,实现了IDataErrorInfo接口:

    image

    索引器去检查_error集合是否传递给它了一个包含和属性名称对应的错误的键(key),如果没有验证错误,会返回一个空字符串。

    在使用Movie类的时候,不需要对HomeController做任何修改。当Title和Director没有值输入的时候,会出现下面的页面:

    image

    注意,DateReleased值也被自动验证了,因为DateReleased属性不接收空值,DefaultModelBinder自动生成了它的验证错误信息。如果你要修改DateReleased属性的错误信息,需要创建一个自定义的模型绑定器。

    总结

    这篇指南中,可以学习到如何使用IDataErrorInfo接口生成验证错误信息。首先需要创建一个Movie的部分类来扩展Entity Framework生成的Movie类;然后再利用OnTitleChanging和OnDirectorChanging创建一些验证逻辑;最后,我们实现IDataErrorInfo接口,在ASP.NET MVC Framework中显示这些验证信息。

  • 相关阅读:
    [LeetCode] Course Schedule
    [Algorithms] Topological Sort
    [Algorithms] Graph Traversal (BFS and DFS)
    [LeetCode] One Edit Distance
    [LeetCode] Summary Ranges
    [LeetCode] Missing Ranges
    [LeetCode] Fraction to Recurring Decimal
    17.Docker之使用dockerfile创建jdk镜像
    16.Docker之使用dockerfile创建nginx镜像
    7.Docker之dockerfile指令简介
  • 原文地址:https://www.cnblogs.com/darkdawn/p/1409648.html
Copyright © 2011-2022 走看看