學習ASP .NET MVC5官方教程總結(十)添加驗證,.netmvc5

來源:互聯網
上載者:User

學習ASP .NET MVC5官方教程總結(十)添加驗證,.netmvc5
                           學習ASP .NET MVC5官方教程總結(十)添加驗證

          在本章中,我們將為Movie模型添加驗證邏輯,並確認驗證規則在使用者試圖使用程式建立和編輯電影時有效。

  ASP.NET MVC 的一個核心原則是DRY(Don't Repeat Yourself - 不做重複的事情)。ASP.NET MVC 鼓勵你一次性的指定功能或行為,然後應用程式的其它地方通過映射得到它,這樣一來就減少了大量的代碼,從而減少了出錯誤的可能性,並且更易於維護。

  ASP.NET  MVC  和 Entity Framework Code First 提供的驗證功能是 DRY 原則的不錯的實踐。你可以在一處(在模型類中)定義驗證規則,從而在應用程式中的所有地方都可以使用這個規則。

  接下來讓我們看看如何在現在的Movie 中添加進階的驗證規則吧。

  現在我們開始為Movie類添加一些驗證規則。

  開啟檔案 Movie.cs,注意命名空間 System.ComponentModel.DataAnnotations 並不包 含 System.Web。DataAnnotations 提供了內建的驗證特性,你可以將它們用在任何類或屬性中(它還包含了像DataType這樣的格式化的特性,它們不參與任何驗證)。

為Movie類添加一些內建的驗證規則,修改後的代碼如下:

public class Movie{    public int ID { get; set; }    [Required]    [StringLength(60, MinimumLength = 3)]    public string Title { get; set; }    [Display(Name = "Release Date")]    [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)]    [Required]    public string Rating { get; set; }}

使用資料移轉來更新資料庫結構。編譯解決方案,然後開啟“封裝管理員控制台”視窗,執行下面的命令:

add-migration DataAnnotationsupdate-database

當這兩個命令執行完成之後,Visual Studio 為我們建立了 DataAnnotations 類,它繼承自 DbMigration。開啟檔案,在它的Up方法中,你會看到升級結構的代碼:

public override void Up(){    AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false, maxLength: 60));    AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false));    AlterColumn("dbo.Movies", "Rating", c => c.String(nullable: false, maxLength: 5));}

從代碼中可以看出,Title、Genre和Rating三個欄位不再允許為空白(這意味著你必須輸入一個值)。Rating 欄位的最大長度為5,Title 的最大長度為60,最小長度為3。

Code First 確保在儲存到資料庫的時候使用你指定的規則對資料進行驗證,例如,下面的代碼在調用SaveChanges的時候會拋出一個錯誤:

MovieDBContext db = new MovieDBContext();Movie movie = new Movie();movie.Title = "Gone with the Wind";db.Movies.Add(movie);  db.SaveChanges(); // <= 會引發一個伺服器段的錯誤,因為movie的必須的欄位沒有賦值

驗證規則在儲存的時候自動生效使得程式變得更為健壯,它可以在是你忘記去驗證,而在不經意間阻止不合法的進入資料庫。

運行應用程式,瀏覽地址 /movies,點擊“Create New”連結添加一個電影。如果我們在輸入過程中出現一些不合法的資料,用戶端將會顯示一些錯誤,這是通過 jQuery 用戶端驗證來實現的。

當出現錯誤的時候,文字框會被加上紅色的邊框,並且會顯示一段錯誤描述資訊。這些錯誤資訊可以在用戶端(使用Javascript 和 jQuery)和伺服器(當用戶端Javascript無效時)段生效。

一個真正的好處是,你不需要在MoviesController 或 Create.cshtml 中修改一行代碼來啟用用戶端驗證,控制器和視圖會根據我們之前定義在Movie類中的驗證特性自動選擇驗證規則。

表單資料出現錯誤的時候不會被提交到伺服器端。

你可能會覺得奇怪,用戶端驗證是如何在沒有修改控制器或視圖代碼的情況下產生的。下面的代碼顯示了MovieController的Create方法,它和我們前面的教程中的Create代碼一樣,並沒有經過修改:

/// GET: /Movies/Createpublic ActionResult Create(){    return View();}//// POST: /Movies/Create[HttpPost][ValidateAntiForgeryToken]public ActionResult Create(Movie movie){    if (ModelState.IsValid)    {        db.Movies.Add(movie);        db.SaveChanges();        return RedirectToAction("Index");    }    return View(movie);}

第一個Create方法顯示一個表單,第二個Create方法用來處理POST請求提交的表單資料。第二個Create方法調用ModelState.IsValid來檢查movie資料是否存在驗證錯誤,調用這個方法來檢查驗證規則,如果存在錯誤,Create 方法將會重新顯示這個表單,如果沒有,則會將Movie資料儲存到資料庫。在我們的例子中,當驗證出現錯誤的時候表單不會提交到伺服器,第二個Create方法將不會調用。如果你禁用了Javascript用戶端驗證,第二個Create方法則會調用ModelState.IsValid對資料進行檢查。

你可以通過在HttpPost Create 方法中添加斷點來監視是否被調用。當用戶端出現錯誤的時候表單將不會提交,如果我們禁用用戶端的Javascript,表單將錯誤的資料提交到伺服器,斷點將會跟蹤到。

下面是 Create.cshtml 視圖的代碼,它被控制器中的Create方法用來顯示初始的form表單,或在發生錯誤時重新顯示帶錯誤資訊的表單資料。

@model MvcMovie.Models.Movie@{   ViewBag.Title = "Create";}<h2>Create</h2>@using (Html.BeginForm()){   @Html.AntiForgeryToken()   @Html.ValidationSummary(true)   <fieldset class="form-horizontal">      <legend>Movie</legend>      <div class="control-group">         @Html.LabelFor(model => model.Title, new { @class = "control-label" })         <div class="controls">            @Html.EditorFor(model => model.Title)            @Html.ValidationMessageFor(model => model.Title, null, new { @class = "help-inline" })         </div>      </div>      <div class="control-group">         @Html.LabelFor(model => model.ReleaseDate, new { @class = "control-label" })         <div class="controls">            @Html.EditorFor(model => model.ReleaseDate)            @Html.ValidationMessageFor(model => model.ReleaseDate, null, new { @class = "help-inline" })         </div>      </div>      <div class="control-group">         @Html.LabelFor(model => model.Genre, new { @class = "control-label" })         <div class="controls">            @Html.EditorFor(model => model.Genre)            @Html.ValidationMessageFor(model => model.Genre, null, new { @class = "help-inline" })         </div>      </div>      <div class="control-group">         @Html.LabelFor(model => model.Price, new { @class = "control-label" })         <div class="controls">            @Html.EditorFor(model => model.Price)            @Html.ValidationMessageFor(model => model.Price, null, new { @class = "help-inline" })         </div>      </div>      <div class="control-group">         @Html.LabelFor(model => model.Rating, new { @class = "control-label" })         <div class="controls">            @Html.EditorFor(model => model.Rating)            @Html.ValidationMessageFor(model => model.Rating, null, new { @class = "help-inline" })         </div>      </div>      <div class="form-actions no-color">         <input type="submit" value="Create" class="btn" />      </div>   </fieldset>}<div>   @Html.ActionLink("Back to List", "Index")</div>@section Scripts {   @Scripts.Render("~/bundles/jqueryval")}

開啟檔案Movie.cs,檢查Movie類,System.ComponentModel.DataAnnotations 命名空間除了一套內建的驗證特性外,還提供了格式化特性。我們已經在ReleaseDate 和Price欄位用到過DataType枚舉,下面的代碼展示了ReleaseDate和Price屬性中使用的DisplayFormat特性:

[Display(Name = "Release Date")][DataType(DataType.Date)]public DateTime ReleaseDate { get; set; }[Range(1, 100)][DataType(DataType.Currency)]public decimal Price { get; set; }

DataType特性不是驗證特性,他們用來告訴試圖引擎如何繪製HTML。在上面的例子中,DataType.Date 特性使ReleaseDate顯示的時候只顯示日期部分,而不顯示時間。下面的DataType特性不驗證資料的格式:

[DataType(DataType.EmailAddress)][DataType(DataType.PhoneNumber)][DataType(DataType.Url)]

這些特性只為試圖引擎格式化顯示資料時提供建議。你可以使用RegularExpression 特性連驗證資料的格式。

除了使用現成的DataType 格式化特性之外,你還可以明確指定 DataFormatString 值。下面的代碼展示了ReleaseDate屬性使用格式化字串的情況,你可以使用它來不顯示ReleaseDate日期的時間部分:

[DisplayFormat(DataFormatString = "{0:d}")]public DateTime ReleaseDate { get; set; }

下面的代碼將Price顯示為貨幣的格式:

[DisplayFormat(DataFormatString = "{0:c}")]public decimal Price { get; set; }

完整的Movie類代碼如下:

public class Movie{    public int ID { get; set; }    [Required]    [StringLength(60, MinimumLength = 3)]    public string Title { get; set; }    [Display(Name = "Release Date")]    [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)]    [Required]    public string Rating { get; set; }}

下面的代碼展示了如何將特性合并在一行顯示:

public class Movie{    public int ID { get; set; }    [Required, StringLength(60, MinimumLength = 3)]    public string Title { get; set; }    [Display(Name = "Release Date"), 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; }    [Required, StringLength(5)]    public string Rating { get; set; }}

在下一章,我們將回顧整個應用程式,並對自動產生的Details 和Delete 方法做一些改進。











聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.