溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

發(fā)布時(shí)間:2021-07-15 16:27:41 來(lái)源:億速云 閱讀:133 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章給大家介紹ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

保持事情 DRY

ASP.NET MVC 的核心設(shè)計(jì)信條之一是DRY: "不要重復(fù)自己(Don't Repeat Yourself)"。ASP.NET MVC鼓勵(lì)您指定功能或者行為,只做一次,然后將它應(yīng)用到應(yīng)用程序的各個(gè)地方。這可以減少您需要編寫的代碼量,并減少代碼出錯(cuò)率,易于代碼維護(hù)。

給ASP.NET MVC 和 Entity Framework Code First 提供驗(yàn)證支持是 DRY 信條的一次偉大實(shí)踐。您可以在一個(gè)地方 (模型類) 中以聲明的方式指定驗(yàn)證規(guī)則,這個(gè)規(guī)則會(huì)在應(yīng)用程序中的任何地方執(zhí)行。

讓我們看看您如何在本電影應(yīng)用程序中,使用此驗(yàn)證支持。

給電影模型添加驗(yàn)證規(guī)則

您將首先向Movie類添加一些驗(yàn)證邏輯。

打開(kāi)Movie.cs文件。在文件的頂部添加using語(yǔ)句,從而引用System.ComponentModel.DataAnnotations命名空間:

using System.ComponentModel.DataAnnotations;

注意,該命名空間不包含System.Web。DataAnnotations 提供了一組內(nèi)置的驗(yàn)證特性,您可以以聲明的方式,應(yīng)用于任何類或?qū)傩浴?/p>

更新Movie類,以利用內(nèi)置的Required、 StringLength和Range驗(yàn)證屬性。以下面的代碼為例,以應(yīng)用驗(yàn)證屬性。

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; }
}

運(yùn)行該應(yīng)用程序,您會(huì)再次得到了以下的運(yùn)行時(shí)錯(cuò)誤:

The model backing the 'MovieDBContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

我們將使用Migrations來(lái)更新 Schema。生成解決方案,然后打開(kāi)軟件包管理器控制臺(tái)窗口,并輸入以下命令:

add-migration AddDataAnnotationsMig
update-database

當(dāng)此命令完后,Visual Studio會(huì)打開(kāi)指定名稱 (AddDataAnnotationsMig)的文件,其中定義了派生自DbMIgration的新類,并在Up方法中,您可以看到代碼更新的Schema 和約束條件。Title 和Genre 字段不再可以為 null (即,您必須輸入一個(gè)值) 并且Rating 字段具有最大長(zhǎng)度是 5。

驗(yàn)證屬性將指定一個(gè)驗(yàn)證行為,這樣您可以指定模型中的那個(gè)屬性需要被強(qiáng)制驗(yàn)證。Required屬性指示該屬性必須有一個(gè)值 ,在此示例中,一部電影必須要有Title、 ReleaseDate、Genre和Price屬性的值,這樣才有效。Range屬性限制了一個(gè)指定范圍內(nèi)的值。StringLength屬性允許您設(shè)置一個(gè)字符串屬性的最大長(zhǎng)度和其最小長(zhǎng)度(可選)。內(nèi)部類型 (例如decimal, int, float, DateTime)默認(rèn)是必須的,所以不需要Required 屬性。

Code First 確保您在模型類上所指定的驗(yàn)證規(guī)則,會(huì)在應(yīng)用程序修改數(shù)據(jù)庫(kù)之前執(zhí)行。例如,下面的代碼在調(diào)用SaveChanges方法時(shí),將引發(fā)異常,因?yàn)槿笔讉€(gè)必需的Movie屬性值,并且價(jià)格為零 (這在有效范圍之外)。

MovieDBContext db = new MovieDBContext();

Movie movie = new Movie();
movie.Title = "Gone with the Wind";
movie.Price = 0.0M;

db.Movies.Add(movie); 
db.SaveChanges();    // <= Will throw server side validation exception

驗(yàn)證規(guī)則會(huì)自動(dòng)被 .NET Framework執(zhí)行,這將有助于使您的應(yīng)用程序更加的可靠。它還確保你不會(huì)因?yàn)橥蓑?yàn)證,無(wú)意中使得壞的數(shù)據(jù)也寫入到了數(shù)據(jù)庫(kù)。

下面是更新后的Movie.cs文件的完整代碼清單:

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; }
  }
}

ASP.NET MVC 的驗(yàn)證錯(cuò)誤UI

重新運(yùn)行應(yīng)用程序,瀏覽 /Movies的 URL。

單擊Create New鏈接,來(lái)添加一部新電影。在窗體中填寫一些無(wú)效值,然后單擊Create按鈕。

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

注意,為了使jQuery支持使用逗號(hào)的非英語(yǔ)區(qū)域的驗(yàn)證 ,需要設(shè)置逗號(hào)(",")來(lái)表示小數(shù)點(diǎn),你需要引入globalize.js并且你還需要具體的指定cultures/globalize.cultures.js文件 (地址在https://github.com/jquery/globalize) 在 JavaScript 中可以使用 Globalize.parseFloat。下面的代碼展示了在"FR-FR" Culture下的Views\Movies\Edit.cshtml 視圖:

@section Scripts {
  @Scripts.Render("~/bundles/jqueryval")
  <script src="~/Scripts/globalize.js"></script>
  <script src="~/Scripts/globalize.culture.fr-FR.js"></script>
  <script>
    $.validator.methods.number = function (value, element) {
      return this.optional(element) ||
        !isNaN(Globalize.parseFloat(value));
    }
    $(document).ready(function () {
      Globalize.culture('fr-FR');
    });
  </script>
  <script>
    jQuery.extend(jQuery.validator.methods, {  
      range: function (value, element, param) {    
        //Use the Globalization plugin to parse the value    
        var val = $.global.parseFloat(value);
        return this.optional(element) || (
          val >= param[0] && val <= param[1]);
      }
    });

  </script>
}

為了使用這種用戶驗(yàn)證界面,真正的好處是,您不需要修改MoviesController類或Create.cshtml視圖中的任何一行代碼。在本教程之前所生成的控制器和視圖中,Movie模型類的屬性上所指定的驗(yàn)證規(guī)則一樣可以自動(dòng)適用。

您可能已經(jīng)注意到了Title 和Genre屬性,在字段中輸入文本或者刪除文本,是不會(huì)執(zhí)行所需的驗(yàn)證屬性的,直到您提交表單 (點(diǎn)Create按鈕)時(shí)才執(zhí)行。對(duì)于字段是最初為空 (如創(chuàng)建視圖中的字段) 和只有Required屬性并沒(méi)有其它驗(yàn)證屬性的字段,您可以執(zhí)行以下操作來(lái)觸發(fā)驗(yàn)證:

1. Tab into the field.

2. Enter some text.

3. Tab out.

4. Tab back into the field.

5. Remove the text.

6. Tab out.

上面的順序?qū)⒂|發(fā)必需的驗(yàn)證,而并不需要點(diǎn)擊提交按鈕。在不輸入任何字段的情況下,直接點(diǎn)擊提交按鈕,將觸發(fā)客戶端驗(yàn)證。直到?jīng)]有客戶端驗(yàn)證錯(cuò)誤的情況下,表單數(shù)據(jù)才會(huì)發(fā)送到服務(wù)器。您可以在服務(wù)器端HTTP Post 方法上加上斷點(diǎn)來(lái)測(cè)試一下,或者使用Fiddler tool或 IE 9 F12 Developer tools.

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

如何驗(yàn)證創(chuàng)建視圖和創(chuàng)建方法

您可能很想知道驗(yàn)證用戶界面在沒(méi)有更新控制器或視圖代碼的情況下是如何生成的。下面列出了MovieController類中的Create方法。它們是之前教程中自動(dòng)生成的,并沒(méi)有修改。

//
// GET: /Movies/Create

public ActionResult Create()
{
  return View();
}

//
// POST: /Movies/Create

[HttpPost]
public ActionResult Create(Movie movie)
{
  if (ModelState.IsValid)
  {
    db.Movies.Add(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
  }

  return View(movie);
}

第一種(HTTP GET)Create 方法用來(lái)顯示初始的創(chuàng)建form。第二個(gè) ([HttpPost]) 方法處理form的請(qǐng)求。第二種Create方法 (HttpPost 版本) 調(diào)用 ModelState.IsValid來(lái)檢查是否有的任何的Movie驗(yàn)證錯(cuò)誤。調(diào)用此方法將驗(yàn)證對(duì)象上所有應(yīng)用了驗(yàn)證約束的屬性。如果對(duì)象含有驗(yàn)證錯(cuò)誤,則Create方法會(huì)重新顯示初始的form。如果沒(méi)有任何錯(cuò)誤,方法將保存信息到數(shù)據(jù)庫(kù)。在我們的電影示例中,我們使用了驗(yàn)證,當(dāng)客戶端檢測(cè)到錯(cuò)誤時(shí),form不會(huì)被post到服務(wù)器;所以第二個(gè)Create方法永遠(yuǎn)不會(huì)被調(diào)用。如果您在瀏覽器中禁用了 JavaScript,客戶端驗(yàn)證也會(huì)被禁用,HTTP POST Create方法會(huì)調(diào)用 ModelState.IsValid來(lái)檢查影片是否含有任何驗(yàn)證錯(cuò)誤。

您可以在HttpPost Create方法中設(shè)置一個(gè)斷點(diǎn),當(dāng)客戶端驗(yàn)證檢測(cè)到錯(cuò)誤時(shí),不會(huì)post form數(shù)據(jù),所以永遠(yuǎn)不會(huì)調(diào)用該方法。如果您在瀏覽器中禁用 JavaScript,然后提交具有錯(cuò)誤信息的form,斷點(diǎn)將會(huì)命中。您仍然得到充分的驗(yàn)證,即使在沒(méi)有 JavaScript的情況下。下圖顯示了如何禁用 Internet Explorer 中的 JavaScript。

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

下圖顯示了如何在火狐瀏覽器中禁用 JavaScript。

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

下圖顯示了如何在 Chrome 瀏覽器中禁用 JavaScript。

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

下面是框架代碼在之前的教程中生成的Create.cshtml視圖模板。它用來(lái)為以上兩個(gè)操作方法來(lái)顯示初始的form,同時(shí)在驗(yàn)證出錯(cuò)時(shí)來(lái)重新顯示視圖。

請(qǐng)注意,代碼如何使用Html.EditorFor helper 輸出為Movie中的每個(gè)屬性的<input>元素。此Helper旁邊是對(duì)Html.ValidationMessageFor方法的調(diào)用。這兩個(gè)Helper方法將處理由控制器傳遞到視圖的模型對(duì)象(在這里是,Movie對(duì)象)。它們會(huì)自動(dòng)查找模型中指定的驗(yàn)證屬性,并顯示適當(dāng)?shù)腻e(cuò)誤消息。

如果您想要在后面更改驗(yàn)證邏輯,您可以做在一個(gè)地方,將驗(yàn)證信息添加到模型上。 (此示例中,是movie 類)。您不必?fù)?dān)心不符合規(guī)則 ,驗(yàn)證邏輯會(huì)在應(yīng)用程序的不同部分執(zhí)行——在一個(gè)地方定義驗(yàn)證邏輯將會(huì)被使用到各個(gè)地方。這使代碼非常干凈,并使它易于維護(hù)和擴(kuò)展。它意味著您會(huì)完全遵守DRY原則。

給影片模型添加Formatting

打開(kāi)Movie.cs文件并查看Movie 類。 System.ComponentModel.DataAnnotations命名空間提供了內(nèi)置的驗(yàn)證特性集的格式屬性。我們已經(jīng)為發(fā)布日期和價(jià)格字段應(yīng)用了DataType枚舉值。下面的代碼示例了ReleaseDate和Price屬性與相應(yīng)的DisplayFormat屬性。

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

DataType屬性不是驗(yàn)證特性,它們用來(lái)告訴視圖引擎如何Render HTML 。在上面的示例中, DataType.Date屬性將影片日期顯示為日期,例如,下面的DataType屬性不會(huì)驗(yàn)證數(shù)據(jù)的格式:

復(fù)制代碼 代碼如下:

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

上面列出的屬性只提供視圖引擎來(lái)顯示數(shù)據(jù)的格式(如:<a> 為 URL ,< href="mailto:EmailAddress.com"> 為電子郵件。您可以使用正則表達(dá)式屬性來(lái)驗(yàn)證數(shù)據(jù)的格式。)

另一種使用DataType 屬性的方式,您可以顯式設(shè)置DataFormatString。下面的代碼示例了具有一個(gè)日期格式字符串的Release Date屬性 (即"d")。

復(fù)制代碼 代碼如下:

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

下面的代碼設(shè)置Price屬性為貨幣格式。

復(fù)制代碼 代碼如下:

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

完整的Movie 類如下所示。

@model MvcMovie.Models.Movie

@{
  ViewBag.Title = "Create";
}

<h3>Create</h3>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>

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

  <fieldset>
    <legend>Movie</legend>

    <div class="editor-label">
      @Html.LabelFor(model => model.Title)
    </div>
    <div class="editor-field">
      @Html.EditorFor(model => model.Title)
      @Html.ValidationMessageFor(model => model.Title)
    </div>

    <div class="editor-label">
      @Html.LabelFor(model => model.ReleaseDate)
    </div>
    <div class="editor-field">
      @Html.EditorFor(model => model.ReleaseDate)
      @Html.ValidationMessageFor(model => model.ReleaseDate)
    </div>

    <div class="editor-label">
      @Html.LabelFor(model => model.Genre)
    </div>
    <div class="editor-field">
      @Html.EditorFor(model => model.Genre)
      @Html.ValidationMessageFor(model => model.Genre)
    </div>

    <div class="editor-label">
      @Html.LabelFor(model => model.Price)
    </div>
    <div class="editor-field">
      @Html.EditorFor(model => model.Price)
      @Html.ValidationMessageFor(model => model.Price)
    </div>
    <div class="editor-label">
  @Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
  @Html.EditorFor(model => model.Rating)
  @Html.ValidationMessageFor(model => model.Rating)
</div>
    <p>
      <input type="submit" value="Create" />
    </p>
  </fieldset>
}

<div>
  @Html.ActionLink("Back to List", "Index")
</div>

運(yùn)行該應(yīng)用程序并瀏覽到Movies控制器。很好的格式化了發(fā)布日期和價(jià)格。下圖顯示了Release Date和使用 "FR-FR" Culture 的Price。

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

下圖為默認(rèn)Culture的顯示(English US) 。

ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器

關(guān)于ASP.NET MVC4中怎么給數(shù)據(jù)模型添加校驗(yàn)器就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI