詳解ASP.NET MVC 2自定義驗(yàn)證
原創(chuàng)【51CTO獨(dú)家特稿】ASP.NET MVC 2內(nèi)置支持在服務(wù)器上驗(yàn)證數(shù)據(jù)注釋驗(yàn)證屬性,本文介紹如何使用System.ComponentModel.DataAnnotations中的基礎(chǔ)類構(gòu)建自定義驗(yàn)證屬性,關(guān)于ASP.NET MVC 2中數(shù)據(jù)注釋是如何工作的,請(qǐng)參考Brad的博客(http://bradwilson.typepad.com/blog/2009/04/dataannotations-and-aspnet-mvc.html)。
#T#
我會(huì)介紹如何連接到ASP.NET MVC 2的客戶端驗(yàn)證擴(kuò)展,以便你可以在客戶端上運(yùn)行JavaScript驗(yàn)證邏輯。
我將創(chuàng)建一個(gè)PriceAttribute來驗(yàn)證某個(gè)值是否大于指定的價(jià)格,并且這個(gè)價(jià)格必須以99分結(jié)束,因此$20.00是無效的值,$19.99是有效的。下面是這個(gè)屬性的代碼:
- public class PriceAttribute : ValidationAttribute {
- public double MinPrice { get; set; }
- public override bool IsValid(object value) {
- if (value == null) {
- return true;
- }
- var price = (double)value;
- if (price < MinPrice) {
- return false;
- }
- double cents = price - Math.Truncate(price);
- if(cents < 0.99 || cents >= 0.995) {
- return false;
- }
- return true;
- }
- }
注意如果值為空,返回的值是true,這個(gè)屬性不會(huì)驗(yàn)證字段是否需要。我會(huì)在RequiredAttribute中驗(yàn)證值是否需要。它允許我將屬性放在可選的值上,當(dāng)用戶將這個(gè)字段留為空時(shí)顯示一個(gè)錯(cuò)誤。
我們可以創(chuàng)建一個(gè)視圖模型,然后應(yīng)用這個(gè)屬性到模型上進(jìn)行快速測(cè)試,下面是這個(gè)模型的代碼:
- public class ProductViewModel {
- [Price(MinPrice = 1.99)]
- public double Price { get; set; }
- [Required]
- public string Title { get; set; }
- }
我們?cè)倏焖俚貏?chuàng)建一個(gè)視圖(Index.aspx)顯示和編輯窗體:
- <%@ Page Language="C#" Inherits="ViewPage
" %>- <% using (Html.BeginForm()) { %>
- <%= Html.TextBoxFor(m => m.Title) %>
- <%= Html.ValidationMessageFor(m => m.Title) %>
- <%= Html.TextBoxFor(m => m.Price) %>
- <%= Html.ValidationMessageFor(m => m.Price) %>
- <input type="submit" />
- <% } %>
現(xiàn)在我們只需要一個(gè)有兩個(gè)行為的控制器,一個(gè)編輯視圖,另一個(gè)接收提交的ProductViewModel。
- [HandleError]
- public class HomeController : Controller {
- public ActionResult Index() {
- return View(new ProductViewModel());
- }
- [HttpPost]
- public ActionResult Index(ProductViewModel model) {
- return View(model);
- }
- }
我們還沒有開啟客戶端驗(yàn)證,下面來看看當(dāng)我們查看這個(gè)頁面并提交一些值時(shí)會(huì)發(fā)生什么。