Asp.net MVC驗證那些事(1)-- 介紹和驗證規則使用


數據的有效性驗證,是程序開發中必不可少的環節。這篇文章,我們將用一個實例來說明如何在MVC中使用Validation來保證無論是新增或者更新數據的時候,都必須符合我們定義的驗證規則,否則就會提示錯誤。

一, DRY原則

DRY是Don’t repeat yourself的縮寫,意思是不要寫重復的代碼。MVC中的Validation設計就是遵循了這個原則。
比如下面中的Movie類, 當用戶在網頁上填寫Movie信息的時候,並保存的數據庫中的時候, 由於Title是我們期望的必填項,所以:

1. 在提交表單的時候,需要檢查Title是否填寫。如果沒有,顯示警告信息。
2. 在保存到數據庫中的時候,也需要檢查Title是否有值.

而這些的驗證規則,MVC遵循DRY的設計,都是添加到Model上。也就是我們這里的Movie實體類上。

public class Movie {
    public int ID { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }
    public string Rating { get; set; }
}

接下來看看如何在Model上添加驗證規則

二,在Movie實體類上添加驗證規則

.net提供的驗證規則在下面的namespace下, 所以在添加代碼之前,先引入下面的命名空間:

using System.ComponentModel.DataAnnotations;

可以注意到,這個命名空間不是以System.Web開頭的,這也說明了它並不單單是為Web項目准備的,如何其它類型的項目都可以使用。

我們在Movie類上使用.net提供的Required, StringLength,Range驗證特性. 下面就是添加完驗證特性后的代碼:

using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
namespace MvcMovie.Models {

    public class Movie {
        public int ID { get; set; }

        [Required]
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }

        [Required]
        public string Genre { get; set; }

        [Range(1, 100)]
        [DataType(DataType.Currency)]

        public decimal Price { get; set; }

        [StringLength(5)]
        public string Rating { get; set; }
    }

    public class MovieDBContext : DbContext {
        public DbSet<Movie> Movies { get; set; }
    }
}

三, 在View頁面中,添加MVC的驗證

MVC在View這一層提供了HtmlHelper,它有一些擴展方法,能夠自動的為我們生成關於字段的客戶端驗證代碼. 這些驗證的代碼必須是在Form中。

@Html.ValidationSummary()會輸出所有驗證錯誤, 一般放在Form頭處。
@Html.ValidationMessageFor()是針對單個輸入的驗證.

下面是Movice Add的完整表單代碼。

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary()

    <fieldset> 
        <legend>Registration Form</legend> 
        <ol> 
            <li> 
                @Html.LabelFor(m => m.Title) 
                @Html.EditorFor(m => m.Title) 
                @Html.ValidationMessageFor(m => m.Title) 
            </li> 
            <li> 
                @Html.LabelFor(m => m.ReleaseDate) 
                @Html.EditorFor(m => m.ReleaseDate) 
                @Html.ValidationMessageFor(m => m.ReleaseDate) 
            </li> 
             <li> 
                @Html.LabelFor(m => m.Genre) 
                @Html.TextBoxFor(m => m.Genre) 
                @Html.ValidationMessageFor(m => m.Genre) 
            </li> 
            <li> 
                @Html.LabelFor(m => m.Price) 
                @Html.EditorFor(m => m.Price) 
                @Html.ValidationMessageFor(m => m.Price) 
            </li> 
             <li> 
                @Html.LabelFor(m => m.Rating) 
                @Html.EditorFor(m => m.Rating) 
                @Html.ValidationMessageFor(m => m.Rating) 
            </li> 
        </ol> 
        <input type="submit" value="Register" /> 
    </fieldset> 
}

四, 運行效果

運行頁面,輸入想下面的內容,點擊Create按鈕,就能夠看到下面的錯誤信息。這里的輸入驗證以及錯誤信息的顯示,就是我們在View中定義的。驗證是通過Js做的,所以並不會刷新頁面。

blog1

五, 后台驗證

只是客戶端驗證,肯定是不夠嚴謹的,還需要添加上服務端驗證,因為很容易繞過客戶端的驗證,直接把非法的數據提交到后端。
由於使用了DRY原則,所以后端代碼代碼也能夠使用Movie實體類上的定義驗證規則, 而且MVC還提供了非常簡單的方法來處理。

下面是我們的服務端檢查代碼

public class MovieController : Controller 
  { 
      [HttpGet] 
      public ActionResult Create() 
      { 
          return View(); 
      }

      [HttpPost] 
      public ActionResult Create(Movie movie) 
      { 
          if (ModelState.IsValid) 
          { 
              //Do Save
             ………… 
              return RedirectToAction("Index", "Home"); 
          } 
          return View(movie); 
      } 
  }

上面的HttpGet,意思是當使用Get請求訪問網頁時,響應的服務端方法。
HttpPost, 是當提交表單的時候,用來響應的方法。它接收一個Movie類型的參數, ModelState.IsValid會自動檢查這個參數是否合法,如果不合法,就返回到原來表單頁面上,顯示檢查錯誤信息。

接下來,看看服務端的效果。首先要屏蔽掉客戶端檢查,方法非常簡單,只需要修改一下web.config文件。
ClientValidationEnabled修改成false. 這樣客戶段驗證就關閉了(實際使用中,推薦開啟客戶端驗證)

<appSettings> 
   <add key="webpages:Version" value="2.0.0.0" /> 
   <add key="webpages:Enabled" value="false" /> 
   <add key="PreserveLoginUrl" value="true" /> 
   <add key="ClientValidationEnabled" value="false" /> 
   <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings>

接着再點擊Create按鈕,提交表單,頁面刷新了。顯示的錯誤信息和上面的完全一樣。

blog2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM