<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # ASP.NET MVC 5 - 給數據模型添加校驗器 在本節中將會給`Movie`模型添加驗證邏輯。并且確保這些驗證規則在用戶創建或編輯電影時被執行。 ## 拒絕重復?DRY ASP.NET MVC 的核心設計信條之一是DRY: "不要重復自己([DRY](http://en.wikipedia.org/wiki/Don't_repeat_yourself) --Don’t Repeat Yourself)"。ASP.NET MVC鼓勵您指定功能或者行為,只做一次,然后將它應用到應用程序的各個地方。這可以減少您需要編寫的代碼量,并減少代碼出錯率,易于代碼維護。 給ASP.NET MVC 和 Entity Framework Code First 提供驗證支持是 DRY 信條的一次偉大實踐。您可以在一個地方 (模型類) 中以聲明的方式指定驗證規則,這個規則會在應用程序中的任何地方執行。 讓我們看看您如何在本電影應用程序中,使用此驗證支持。 ## 給電影模型添加驗證規則 您將首先向`Movie`類添加一些驗證邏輯。 打開_Movie.cs_ 文件,注意到System.Web 命名空間并未包含[System.ComponentModel.DataAnnotations](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx). DataAnnotations提供了一組內置的嚴重屬性,可供您應用于類、屬性。(DataAnnotations也包含一個[DataType](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype.aspx)屬性,來幫助格式化的辦法來校驗) 更新`Movie`類,以利用內置的[`Required`](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx)、 [`StringLength`](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.stringlengthattribute.aspx), [RegularExpression](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.regularexpressionattribute.aspx)和[`Range`](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx)驗證屬性。以下面的代碼為例,以應用驗證屬性。 ``` public class Movie { public int ID { get; set; } [StringLength(60, MinimumLength = 3)] public string Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ReleaseDate { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")] [Required] [StringLength(30)] public string Genre { get; set; } [Range(1, 100)] [DataType(DataType.Currency)] public decimal Price { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")] [StringLength(5)] public string Rating { get; set; } } ``` 在[StringLength](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.stringlengthattribute.aspx)屬性設置字符串的最大長度,它會在數據庫上設置此限制,因此的數據庫schema將發生變化。右鍵單擊**電影表****,** **在服務器資源管理器****(****Server? explorer****)**,然后單擊**打開表定義**(**Open Table Definition**): ![](https://box.kancloud.cn/2016-01-02_568736b94cb75.gif) 在上面的圖片中,你可以看到所有的字符串字段被設置為了[NVARCHAR? (MAX)](http://technet.microsoft.com/en-us/library/ms186939.aspx)數據類型.? 我們將使用遷移來更新架構。生成解決方案,然后打開**軟件包管理器控制臺**(the **Package Manager Console** ),輸入如下命令: add-migration DataAnnotations update-database 當這個命令完成后,Visual Studio將打開類代碼文件,它定義了新DbMIgration派生類(DataAnnotations),你可以在Up方法看到更新架構約束代碼如下所示: ``` public override void Up() { AlterColumn("dbo.Movies", "Title", c => c.String(maxLength: 60)); AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false, maxLength: 30)); AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5)); } ``` 該流派(Genre)字段不再可為Null(也就是說,你必須輸入一個值)。該評級(Rating)字段最大長度為5, 標題的最大長度為60。標題(Title )和價格 (Price)的范圍的最小長度并沒有更改。 請在數據庫中,檢查電影表的schema: ![](https://box.kancloud.cn/2016-01-02_568736b96104f.gif) 該字符串字段顯示新的長度限制和流派字段(Genre)不能再為空。 驗證屬性指明您想要應用到模型屬性的行為。[Required](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute(VS.110).aspx) 和MinimumLength屬性指出某一屬性不可為空,但沒有什么能夠阻止用戶輸入空格來驗證。該[RegularExpression](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.regularexpressionattribute.aspx)屬性是用來限制哪些字符可以輸入。在上面的代碼中,流派(Genre)和等級(Rating)只能使用字母(空格,數字和特殊字符是不允許的)。該范圍([Range](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx) )屬性約束的值在一個指定范圍內。在StringLength 屬性允許您設置一個字符串屬性的最大長度,以及最小長度(可選的)。值類型(decimal, int, float, DateTime)有固有必需設置的,不需要的Required屬性。 Code First確保你的模型在指定class上在驗證規則強制執行之前應用程序將變更儲存在數據庫中。例如,下面的代碼將拋出一個[DbEntityValidationException](http://msdn.microsoft.com/en-us/library/system.data.entity.validation.dbentityvalidationexception(v=vs.103).aspx) 異常時,調用SaveChanges方法時,因為幾個必要的Movie屬性缺少: ``` MovieDBContext db = new MovieDBContext(); Movie movie = new Movie(); movie.Title = "Gone with the Wind"; db.Movies.Add(movie); db.SaveChanges(); // <= Will throw server side validation exception ``` 上面的代碼會拋出以下異常: _Validation failed for one or more entities._ 參閱_? 'EntityValidationErrors'_ 屬性獲得更多信息_._ 具有通過.NET Framework會自動強制執行的驗證規則, 有助于使你的應用程序更加健壯。它還確保可以不會忘記驗證的東西,即在不經意間不會讓壞的數據寫入數據庫。 ## ASP.NET MVC 的驗證錯誤UI 重新運行應用程序,瀏覽 _/Movies_的 URL。 單擊**Create New**鏈接,來添加一部新電影。在窗體中填寫一些無效值,然后單擊**Create**按鈕。 如同jQuery的客戶端驗證來檢測到錯誤時,它會顯示一個錯誤消息。 ![](https://box.kancloud.cn/2016-01-02_568736b96ec99.png) **注意**,為了使jQuery支持使用逗號的非英語區域的驗證 ,需要設置逗號(",")來表示小數點,如本教程前面所述, 你須引入NuGet globalize。請注意,表單在每一個相應的驗證錯誤消息旁邊,已經自動使用紅色邊框的顏色突出顯示文本框指明無效數據。這些錯誤是強制執行了客戶端端(使用JavaScript和jQuery)和服務器端(如果用戶禁用了JavaScript)。 一個真正的好處是,你并不需要更改MoviesController類或Create.cshtml視圖中的一行代碼,來啟用此驗證的用戶界面。您在前面教程所創建的控制器和視圖會自動啟用,使用驗證指明的Movie model類的屬性。使用Edit行為方法,同樣的驗證方法也完全適用。直到沒有任何客戶端驗證錯誤的表單數據,才會被發送回服務器。您可以通過在HTTP POST方法,用一個斷點來驗證這一點; 或通過使用[fiddler tool](http://fiddler2.com/fiddler2/),或者IE瀏覽器[F12 developer tools](http://msdn.microsoft.com/en-us/ie/aa740478)。 ## 如何驗證創建視圖和創建方法 您可能很想知道驗證用戶界面在沒有更新控制器或視圖代碼的情況下是如何生成的。下面列出了`MovieController`類中的`Create`方法。它們是之前教程中自動生成的,并沒有修改。 ``` public ActionResult Create() { return View(); } // POST: /Movies/Create // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "ID,Title,ReleaseDate,Genre,Price,Rating")] Movie movie) { if (ModelState.IsValid) { db.Movies.Add(movie); db.SaveChanges(); return RedirectToAction("Index"); } return View(movie); } ``` 第一種(HTTP GET)`Create` 方法用來顯示初始的創建form。第二個 (`[HttpPost]`) 方法處理form的請求。第二種`Create`方法 (`HttpPost` 版本) 調用 `ModelState.IsValid`來檢查是否有任何的Movie驗證錯誤。調用此方法將驗證對象上所有應用了驗證約束的屬性。如果對象含有驗證錯誤,則`Create`方法會重新顯示初始的form。如果沒有任何錯誤,方法將保存信息到數據庫。在我們的電影示例中,我們使用了驗證,**當客戶端檢測到錯誤時,****form不會被post到服務器;所以第二個****Create****方法永遠不會被調用**。如果您在瀏覽器中禁用了 JavaScript,客戶端驗證也會被禁用,HTTP POST `Create`方法會調用 [ModelState.IsValid](http://msdn.microsoft.com/en-us/library/system.web.mvc.modelstatedictionary.isvalid.aspx)來檢查影片是否含有任何驗證錯誤。 您可以在`HttpPost Create`方法中設置一個斷點,當客戶端驗證檢測到錯誤時,不會post form數據,所以永遠不會調用該方法。如果您在瀏覽器中禁用 JavaScript,然后提交具有錯誤信息的form,斷點將會命中。您仍然得到充分的驗證,即使在沒有 JavaScript的情況下。 下圖顯示了如何禁用 Internet Explorer 中的 JavaScript。 ![](https://box.kancloud.cn/2016-01-02_568736b980fa4.jpg) ![](https://box.kancloud.cn/2016-01-02_568736b9abb65.jpg) 下圖顯示了如何在火狐瀏覽器中禁用 JavaScript。 ![](https://box.kancloud.cn/2016-01-02_568736b9bc244.jpg) 下圖顯示了如何在 Chrome 瀏覽器中禁用 JavaScript。 ![](https://box.kancloud.cn/2016-01-02_568736b9d6107.jpg) 下面是框架代碼在之前的教程中生成的_Create.cshtml_視圖模板。它用來為以上兩個操作方法來顯示初始的form,同時在驗證出錯時來重新顯示視圖。 ``` @model MvcMovie.Models.Movie @{ ViewBag.Title = "Create"; } <h2>Create</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Movie</h4> <hr /> @Html.ValidationSummary(true) <div class="form-group"> @Html.LabelFor(model => model.Title, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title) </div> </div> @*Fields removed for brevity.*@ <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") } ``` 請注意,代碼如何使用`Html.EditorFor` helper 輸出為`Movie`中的每個屬性的`&lt;input&gt;`元素。此Helper旁邊是對`Html.ValidationMessageFor`方法的調用。這兩個Helper方法將處理由控制器傳遞到視圖的模型對象(在這里是,`Movie`對象)。它們會自動查找模型中指定的驗證屬性,并顯示適當的錯誤消息。 如果您想要在后面更改驗證邏輯,您可以做在一個地方,將驗證信息添加到模型上。 (此示例中,是`movie` 類)。您不必擔心不符合規則 ,驗證邏輯會在應用程序的不同部分執行——在一個地方定義驗證邏輯將會被使用到各個地方。這使代碼非常干凈,并使它易于維護和擴展。它意味著您會完全遵守DRY原則。 ## 使用DataType屬性 打開Movie.cs文件并檢查Movie類。在[System.ComponentModel.DataAnnotations](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx)命名空間提供的格式化(formatting)屬性,除了內置的一套驗證的屬性。我們已經應用了的[DataType](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype.aspx)枚舉值的ReleaseDate和Price 字段。下面的代碼顯示了ReleaseDate和Price 用適當的的[DataType](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype.aspx)屬性。 [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } [DataType(DataType.Currency)] public decimal Price { get; set; } 該[DataType](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatypeattribute.aspx)屬性只提供提示的視圖引擎對數據進行格式化(與相應的屬性,如&lt;a&gt;取代的URL及 &lt;a href="mailto:EmailAddress.com"&gt;取代電子郵件。您可以使用[RegularExpression](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.regularexpressionattribute.aspx)的屬性來驗證數據格式。[DataType](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatypeattribute.aspx)屬性用于指定一個比數據庫內部類型更加具體的一種數據類型,但它們不是驗證屬性。在這種情況下,我們只需要保留的日期跟蹤,而不是日期和時間。該枚舉的DataType提供了多種數據類型,如_Date, Time,? PhoneNumber, Currency, EmailAddress_ 和其他更多的。該的DataType 的屬性也可以使應用程序來自動提供特定類型的功能。例如,一個mailto:鏈接可以[DataType.EmailAddress](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype.aspx)創建和日期選擇器可以在支持[HTML5](http://html5.org/)的瀏覽器提供的[DataType.Date](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype.aspx)。該數據類型屬性發出的[HTML5](http://html5.org/)[data-](http://ejohn.org/blog/html-5-data-attributes/)(發音讀數據破折號)屬性與[HTML5](http://html5.org/)的瀏覽器可以理解。 該DataType 屬性不提供任何驗證。 DataType.Date并未指定顯示的日期格式。默認情況下,根據基于服務器的的[CultureInfo](http://msdn.microsoft.com/en-us/library/vstudio/system.globalization.cultureinfo(v=vs.110).aspx)預設格式顯示數據字段。 該[DisplayFormat](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.aspx)的屬性是用來顯式地指定日期格式的: [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime EnrollmentDate { get; set; } 該ApplyFormatInEditMode設置指定了當值進行編輯顯示在一個文本框中,格式化亦應適用。 (您可能不希望這樣的某些字段 - 例如貨幣值,你可能不希望在編輯文本框中出現貨幣符號。) 你可以單獨使用[DisplayFormat](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.aspx)屬性;但和DataType屬性一起,通常是一個好主意。該[DataType](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatypeattribute.aspx) 屬性傳遞數據的語義,而不是如何呈現它在屏幕上,并具有以下的優點,不帶DisplayFormat的: · 瀏覽器可以使HTML5的功能(例如顯示一個日歷控件,在區域設置相應的貨幣符號,電子郵件中的鏈接,等等)。 · 默認情況下,瀏覽器就會使用基于語言環境([locale](http://msdn.microsoft.com/en-us/library/vstudio/wyzd2bce.aspx))的正確格式呈現數據。 · 在的[DataType](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatypeattribute.aspx)屬性可以使MVC選擇合適的字段模板以呈現數據(如果本身所使用的的[DisplayFormat](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.aspx)使用字符串模板)。欲了解更多信息,請參閱see Brad? Wilson's的[ASP.NET MVC 2 Templates](http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html)。 (雖然寫的MVC2,本文仍然適用于ASP.NET MVC 5的當前版本。) 如果你使用了的DataType的屬性具有一個日期字段,你也必須指明,以確保字段正確地呈現Chrome瀏覽器中的DisplayFormat屬性。欲了解更多信息,請參閱[this StackOverflow thread](http://stackoverflow.com/questions/12633471/mvc4-datatype-date-editorfor-wont-display-date-value-in-chrome-fine-in-ie)。 注:jQuery的驗證不與[Range](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx)屬性和[DateTime](http://msdn.microsoft.com/en-us/library/system.datetime.aspx)的同時工作。例如,下面的代碼總是顯示一個客戶端驗證錯誤,即使當日期是在指定的范圍內: [Range(typeof(DateTime), "1/1/1966", "1/1/2020")] 你可能會禁用jQuery的日期校驗,而使用帶有的[Range](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx)屬性[DateTime](http://msdn.microsoft.com/en-us/library/system.datetime.aspx)。這通常不是一個好的做法,在你的模型里,編譯器很難確定日期,所以使用[Range](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx)屬性和[DateTime](http://msdn.microsoft.com/en-us/library/system.datetime.aspx)效果不好。 下面的代碼顯示在同一行合并屬性: ``` 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` 方法。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看