Welcome 微信登录

首页 / 网页编程 / ASP.NET / 登峰造极的ASP.NET - ASP.NET MVC 2中的模型验证和元数据

登峰造极的ASP.NET - ASP.NET MVC 2中的模型验证和元数据2011-08-03 MSDN K. Scott AllenASP.NET MVC 2 版本新增的一项功能可以验证服务器和客户端的用户输入。您只需为该框架提供一些 有关要验证数据的信息,该框架将会为您处理艰巨的工作和详细信息。

对于我们这些使用 ASP.NET MVC 1.0 编写自定义验证代码和自定义模型绑定器来执行简单模型验证的 人来说,此功能可谓天赐福音。在本文中,我将探讨 ASP.NET MVC 2 中内置的验证支持。

不过,在讨论这些新功能之前,我将回顾一下旧的方法。多年来,ASP.NET WebForms 中的验证功能一 直让我非常满意。我想,回顾一下这些功能对于理解验证框架的作用非常有帮助。

控制验证

您如果用过 ASP.NET WebForms,应当会知道将验证逻辑添加到 WebForm 中相对简单。您使用控件表 示验证规则。例如,如果要确保用户在 TextBox 控件中输入特定文本,只需添加一个指向 TextBox 的 RequiredFieldValidator 控件,如下所示:

<form id="form1" runat="server">
<asp:TextBox runat="server" ID="_userName" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="_userName"
ErrorMessage="Please enter a username" />
<asp:Button runat="server" ID="_submit" Text="Submit" />
</form>

RequiredFieldValidator 将封装客户端和服务器端的逻辑以确保用户提供的是用户名。若要提供客户 端验证,该控件会将 JavaScript 发送到客户端浏览器,此脚本可确保将表单传回服务器之前用户操作满 足所有验证规则。

想想这些 WebForm 验证控件提供了什么,它们的功能的确异常强大!

可以通过声明方式为一个位置的页面表示验证规则。

如果用户操作不满足这些验证规则,客户端验证将阻止往返服务器。

服务器验证将防止恶意用户避开客户端脚本。

服务器和客户端验证逻辑保持同步,而不会成为维护问题。

但是在 ASP.NET MVC 中,您无法使用这些验证控件并继续忠实 MVC 设计模式的精神。幸运的是,此 框架的第 2 版中的一些功能甚至更好。

控件与模型

可以将 WebForm 控件(如 TextBox)视为一个简单的用户数据容器。可以用初始值填充此控件,并向 用户显示该值,也可以在回发后通过检查该控件来检索用户输入或编辑的任何值。使用 MVC 设计模式时 ,M(模型)与数据容器扮演着相同的角色。可以用需要提供给用户的信息来填充模型,它会将更新的值 回送到您的应用程序。因此,模型是表示验证规则和约束的一个理想场所。

下面是一个现成的示例。如果创建一个新的 ASP.NET MVC 2 应用程序,您将在新项目中找到一个控制 器 AccountController。该控制器负责处理新用户的注册请求,以及登录和密码更改请求。其中每个操作 都使用一个专用的模型对象。可以在 Models 文件夹中的 AccountModels.cs 文件中找到这些模型。例如 ,不带验证规则的 RegisterModel 类如下所示:

public class RegisterModel
{
public string UserName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
}

AccountController 的 Register 操作将此 RegisterModel 类的实例用作参数:

[HttpPost]
public ActionResult Register(RegisterModel model)
{
// ...
}