MVC Validation
Server-side Validation
要驗證資料的有效性,我們可以在 server-side 撰寫驗證程式碼。其步驟如下:
1.在 View Page 中加入 ValidationExtensions:
- ValidationMessage:輸出驗證錯誤的訊息
- ValidationSummary:輸出驗證錯誤的訊息清單
2.在 Server 端,透過 ModelState來自訂錯的內容
Title:
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
Price:
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
[HttpPost]
public ActionResult Edit(TProducts TProducts)
{
if (TProducts.Title.Equals("test"))
this.ModelState.AddModelError("Title", "不可以為test");
if (ModelState.IsValid)
{
db.TProducts.Attach(TProducts);
db.ObjectStateManager.ChangeObjectState(TProducts, EntityState.Modified);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(TProducts);
}
在程式中可以必須使用 ModelState.AddModelError() 來加入自訂的錯誤訊息, 它會顯示在 View 的 Html.ValidationMessage 或 Html.ValidationSummary 的位置,若沒有錯誤訊息則不會顯示。 隨後可利用 ModelState.IsValid 來確認 Model 的有效性,以決定是否要取用 Model 的資料或是提示使用者錯誤訊息。
程式的執行結果是:
Client-side Validation
ASP.NET MVC 本身並未內建自動化的 client validation,它是直接使用 Dynamic Data 所提供的 Model Validation 功能。
Model Validation 指的是使用 metadata 來設定欄位資訊和驗證功能。 要套用這個功能,你只要在 Model 層中建立該物件類別的 metadata ,並直接加上驗證指令, 它就會配合用戶端的 Client-side library 做協同處理,達到 client-validation 的功能。
這些 MetadataType 屬性都包含在 DataAnnotations命名空間之中。
- 先建一個 metadata 類別 (using DataAnnotations )
- 再建立一個該資料模型的 partial 類別,並透過 MetadataType屬性指定其 metadata 類別
Create Metadta Class
public class CustomersMetadata
{
[StringLength(40)]
[Required(ErrorMessage = "Customer id is required.")]
[Display(Name="客戶ID")]
public object CustomerID { get; set; }
[Required(ErrorMessage = "ContactName is required.")]
[Display(Name = "連絡人")]
public object ContactName { get; set; }
[Required(ErrorMessage = "Phone is required.")]
[Display(Name = "連絡電話")]
public object Phone { get; set; }
}
[MetadataType(typeof(CustomersMetadata))]
public partial class Customers
{
}
Controller
在建立 metadata 類別之後,controller 會依據 metadata 中的設定去處理商務規則。 接著使用 ModelState.IsValid方法檢查是否所有的驗證規則都有過關, 如果驗證沒過關,錯誤訊息將被 render 在 ResultView 中, 如果驗證過關,則使用者將被帶到索引頁。
[MyActionFilter]
public ViewResult Index()
{
return View("ResultView", customer);
}
[HttpPost]
public ViewResult Index(Customers customer)
{
[HttpPost]
public ActionResult Index(Customers customer)
{
if (ModelState.IsValid) //模型的驗證狀態
return RedirectToAction("Index"); //if pass, redirect to index action
else
return View("ResultView", customer); //if fail, return Index View
}
}
View
底下是一個 Edit 型態的強型別 view 。 在這個 View 中,使用 helper 類別中的 ValidationMessageFor和 ValidationSummary來產生驗證項目。 同時必須要確認在 ViewPage 中是否引用 jquery.validate.min.js 和 jquery.validate.unobtrusive.min.js 指令碼。 若為 MVC2 則為 MicrosoftAjax.js 和 MicrosoftMvcValidation.js 。
@model MvcApplication1.Models.Customers
@{
ViewBag.Title = "ViewPage2";
}
@using (Html.BeginForm())
{
@Html.LabelFor(model => model.CustomerID) | @Html.EditorFor(model => model.CustomerID) @Html.ValidationMessageFor(model => model.CustomerID) |
@Html.LabelFor(model => model.ContactName) | @Html.EditorFor(model => model.ContactName) @Html.ValidationMessageFor(model => model.ContactName) |
@Html.ValidationSummary(true)
}
@model MvcApplication1.Models.Customers
@{
ViewBag.Title = "ViewPage3";
}You Type ...
CustomID: @Html.Label(Model.CustomerID)
ContactName: @Html.Label(Model.ContactName)
jQuery.validation
h1_XXXXX
Store Generated Pattern
Entity Framework 有個 StoreGeneratedPattern屬性, 可以設定在 SSDL 所定義的資料庫結構中的欄位, 當 insert 或 update 發生時,採用何種方式更新欄位值。
- None:預設值,表示不是由資料庫決定,所以會由程式端取得資料。
- Identity:該欄位由在 insert 時由資料庫決定,update 時不更新。
- Computed:該欄位在 insert 或 update 時都由資料庫決定。
下圖是設定這個屬性的位置。