MVC神韻---你想在哪解脫!(十六)

MVC驗證屬性自動驗證原理

也許有人會問,既然咱們沒有在C與V追加任何顯示錯誤信息提示的代碼,那麼控制器或視圖內部是如何生成這些顯示錯誤信息提示的畫面的。讓咱們揭開這麼謎底吧!當在Movie類中追加了驗證屬性規則後,咱們並無修改這個類中的任何代碼!要揭開這個謎底,首先讓咱們看看MovieController類中的代碼:javascript

 

 1 public ActionResult Create()
 2 {
 3     return View();
 4 }
 5  
 6 //
 7 // POST: /Movies/Create
 8  
 9 [HttpPost]
10 public ActionResult Create(Movie newMovie)
11 {
12     if (ModelState.IsValid)
13     {
14         db.Movies.Add(newMovie);
15         db.SaveChanges();
16  
17         return RedirectToAction("Index");
18     }
19     else
20     {
21         return View(newMovie);
22     }
23 }
View Code

 

問題就出在ModelState.IsValid屬性(固然此屬於在應用中也有問題。好比安全考慮咱們對自動綁定進行了限制,而沒用上或沒綁定的不驗證時,此屬性會出錯)。ModelState.IsValid屬性用來判斷是否提交的電影數據中包含有任何沒有經過數據驗證的無效數據。若是存在無效數據,Create方法從新返回追加電影視圖。若是數據所有有效,則將該條數據保存到數據庫中。咱們以前建立的使用支架模板的Create.cshtml視圖模板中的代碼顯示以下,在首次打開追加電影視圖與數據沒有經過驗證時,Create方法中返回的視圖都是使用的這個視圖模板。html

 

 1 @model MvcMovie.Models.Movie
 2 @{
 3     ViewBag.Title = "追加電影信息";
 4 }
 5 <h2>追加電影信息</h2>
 6 <script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
 7 type="text/javascript"></script>
 8 <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
 9 type="text/javascript"></script>
10  
11 @using (Html.BeginForm()) {
12     @Html.ValidationSummary(true)
13     <fieldset>
14         <legend>電影</legend>
15         <div class="editor-label">
16             標題
17         </div>
18         <div class="editor-field">
19             @Html.EditorFor(model => model.Title)
20             @Html.ValidationMessageFor(model => model.Title)
21         </div>
22         <div class="editor-label">
23             發行日期
24         </div>
25         <div class="editor-field">
26             @Html.EditorFor(model => model.ReleaseDate)
27             @Html.ValidationMessageFor(model => model.ReleaseDate)
28         </div>
29         <div class="editor-label">
30            種類
31         </div>
32         <div class="editor-field">
33             @Html.EditorFor(model => model.Genre)
34             @Html.ValidationMessageFor(model => model.Genre)
35         </div>
36         <div class="editor-label">
37             票價
38         </div>
39         <div class="editor-field">
40             @Html.EditorFor(model => model.Price)
41             @Html.ValidationMessageFor(model => model.Price)
42         </div>
43         <p>
44             <input type="submit" value="追加" />
45         </p>
46     </fieldset>
47 }
48 <div>
49     @Html.ActionLink("返回電影列表", "Index")
50 </div>
View Code

 

以看到在許多頁面控件後面緊跟着一個Html.ValidationMessageFor輔助方法。此方法自動尋找指定給模型的各個驗證屬性,而後顯示對應的驗證錯誤信息。這種驗證體制的好處是在於控制器和Create視圖(追加電影視圖)事先都即不知道實際指定的驗證規則,也不知道將會顯示什麼驗證錯誤信息。驗證規則和錯誤信息只在Movie類中被指定。若是咱們以後想要改變驗證規則,咱們也只要在Model模型類中進行改變就能夠了。咱們不用擔憂整個應用程序中存在驗證規則不統一的問題,全部的驗證規則均可以集中在一處地方進行指定,而後在整個應用程序中使用這些驗證規則。這將使咱們的代碼更加清晰明確,更加具備可讀性、可維護性與可移植性。這將意味着咱們的代碼是真正符合DRY原則(一處指定,處處可用)。java

 

 

 

附錄:jquery

當某些字段很重要,爲了安全不容許自動綁定以防止黑客篡改客戶端,經過自動綁定了解須要保密的某些屬性字段。因此咱們對自動綁定進行了限制,經過[Bind(Include="")]來設置容許自動綁定的字段,而ModelState.IsValid屬性就不能繼續使用了,否則必定會出錯。此時要用TryUpdateModel()方法來替換!數據庫

相關文章
相關標籤/搜索