Quantcast
Channel: VITO小舖 - ASP.NET
Viewing all articles
Browse latest Browse all 41

MVC Validation

$
0
0

MVC Validation

Server-side Validation

要驗證資料的有效性,我們可以在 server-side 撰寫驗證程式碼。其步驟如下:

1.在 View Page 中加入 ValidationExtensions

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命名空間之中。

  1. 先建一個 metadata 類別 (using DataAnnotations )
  2. 再建立一個該資料模型的 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 類別中的 ValidationMessageForValidationSummary來產生驗證項目。 同時必須要確認在 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 時都由資料庫決定。

下圖是設定這個屬性的位置。

h2_XXXXX


Viewing all articles
Browse latest Browse all 41

Trending Articles