学习笔记:ASP.NET MVC2 之验证

大家好,最近忙于工作,现在又有空闲了,现在一起来温习一下ASP.NET MVC 2 的Validation功能。

ASP.NET MVC2 支持2种验证模式,一种是前端验证,一种是服务端验证。我们一般做项目都是2种一起用的。先使用前端验证的好处毋庸置疑,因为它是在客户端执行的,它会把错误消息直接反馈给客户而无须经过服务器的处理,这样就节省了服务器宝贵的资源。而之后的服务器验证呢,又能保证数据的严格符合规格。

第一步:好,我们先来建立一个叫做Order的Model。

namespace MvcApplication1.Models
{
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

public class Order
{
[Required(ErrorMessage
= "First Name is required")]
[DisplayName(
"First Name")]
[StringLength(
160)]
public string FirstName { get; set; }

[Required(ErrorMessage
= "Last Name is required")]
[DisplayName(
"Last Name")]
[StringLength(
160)]
public string LastName { get; set; }

[Required(ErrorMessage
= "Address is required")]
[StringLength(
70)]
public string Address { get; set; }
}
}

在这个Model里面,这些Required,StringLength代表的就是你的验证规则。比较详细的验证规则见以下列表:

  • Range – 是你的数据是不是在某一个范围内的意思。
  • ReqularExpression – 是你的数据是不是符合某一个正则表达式的意思
  • Required – 要求你的数据必须是非空的
  • StringLength – 要求你的字符串的长度必须小于或等于某一个值
  • 代码中的ErrorMessage表示显示在页面上的错误信息。

    你甚至可以写一个自定义的验证类,比如一个简单的例子,我需要让FirstName这个字段必须不以下划线开头,我们可以这么写:

    首先创建一个类,叫做FirstNameAttribute,它必须继承ValidationAttribute这个类。

    namespace MvcApplication1.Models
    {
    using System.ComponentModel.DataAnnotations;

    public class FirstNameAttribute : ValidationAttribute
    {
    public override bool IsValid(object value)
    {
    if (value == null)
    return false;
    if (value.ToString().StartsWith("_"))
    return false;

    return true;
    }
    }
    }

    然后我们就能在FirstName这个字段上加上一个约束的规则。

    [Required(ErrorMessage = "First Name is required")]
    [DisplayName(
    "First Name")]
    [StringLength(
    160)]
    [FirstName(ErrorMessage
    ="First Name can't start with \"_\"")]
    public string FirstName { get; set; }

     

     

    第二步:我们现在来建立一个View。

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Order>" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Order
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
    Order
    </h2>
    <%using (Html.BeginForm())
    {
    %>
    <ul>
    <li>
    <%:Html.LabelFor(m=>m.FirstName) %><%:Html.TextBoxFor(m=>m.FirstName) %><%:Html.ValidationMessageFor(m=>m.FirstName) %>
    </li>
    <li>
    <%:Html.LabelFor(m=>m.LastName) %><%:Html.TextBoxFor(m=>m.LastName) %><%:Html.ValidationMessageFor(m=>m.LastName) %>
    </li>
    <li>
    <%:Html.LabelFor(m=>m.Address) %><%:Html.TextBoxFor(m=>m.Address) %><%:Html.ValidationMessageFor(m=>m.Address) %>
    </li>
    <input type="submit" value="Save" />
    </ul>
    <%} %>
    </asp:Content>

     

     

    第三步:在Controller里面加入要处理你这个提交的请求的controller Method.

    [HttpPost]
    public ActionResult Order(Order orderModel)
    {
    if (ModelState.IsValid)
    {
    //Do what you want

    return RedirectToAction("Index");
    }
    else
    {
    return View(orderModel);
    }
    }

    到这里,一个服务器端的验证已经完成,可以试用一下效果:

    好了,如果要想实现前段验证,只需要做以下几个简单的步骤就可以实现了:

    将这三个js加入到你的master page里面:

    <script src="http://www.cnblogs.com/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
    <script src="http://www.cnblogs.com/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
    <script src="http://www.cnblogs.com/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>

    接着在你的 using (Html.BeginForm())之前加入以下代码:

    <%Html.EnableClientValidation(); %>

    这样就大功告成了,有心的朋友可以发现,你刷新完页面后,代码里面多了一些js代码,这些应该就是实现前段验证的代码:

    <script type="text/javascript">
    //<![CDATA[
    if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
    window.mvcClientValidationMetadata.push({
    "Fields":[{"FieldName":"FirstName","ReplaceValidationMessageContents":true,"ValidationMessageId":"FirstName_validationMessage","ValidationRules":[{"ErrorMessage":"The field First Name must be a string with a maximum length of 160.","ValidationParameters":{"minimumLength":0,"maximumLength":160},"ValidationType":"stringLength"},{"ErrorMessage":"First Name is required","ValidationParameters":{},"ValidationType":"required"}]},{"FieldName":"LastName","ReplaceValidationMessageContents":true,"ValidationMessageId":"LastName_validationMessage","ValidationRules":[{"ErrorMessage":"The field Last Name must be a string with a maximum length of 160.","ValidationParameters":{"minimumLength":0,"maximumLength":160},"ValidationType":"stringLength"},{"ErrorMessage":"Last Name is required","ValidationParameters":{},"ValidationType":"required"}]},{"FieldName":"Address","ReplaceValidationMessageContents":true,"ValidationMessageId":"Address_validationMessage","ValidationRules":[{"ErrorMessage":"Address is required","ValidationParameters":{},"ValidationType":"required"},{"ErrorMessage":"The field Address must be a string with a maximum length of 70.","ValidationParameters":{"minimumLength":0,"maximumLength":70},"ValidationType":"stringLength"}]}],"FormId":"form0","ReplaceValidationSummary":false});
    //]]>
    </script>

    好了,至此为止,我们已经完成了温习ASP.NET MVC2的Validation这个重要的功能。

    posted @ 2011-04-25 17:04  看花开花落  阅读(2135)  评论(6编辑  收藏  举报