熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET MVC如何實現自定義驗證

2013-11-13 09:47:59  來源: .NET編程 
    ASPNET MVC通過Model驗證幫助我們很容易的實現對數據的驗證在默認的情況下基於ValidationAttribute的聲明是驗證被使用我們只需要將相應的ValidationAttribute應用到Model的類型或者屬性上即可對於自定義驗證我們也只需要定義相應的Validation就可以了不過服務端驗證比較簡單而客戶端驗證就要稍微復雜一些本文提供一個簡單的實例說明在ASPNET MVC中實現自定義驗證的基本步驟    
AgeRangeAttribute
   
    用於驗證出生日期字段以確保年齡在制定的范圍之內的AgeRangeAttribute定義如下簡單起見我們直接讓它直接繼承自RangeAttribute服務端驗證邏輯定義在重寫的IsValid方法中並且重寫了FormatErrorMessage方法以便生成針對年齡的驗證消息AgeRangeAttribute實現了IClientValidatable接口並在實現的GetClientValidationRules方法中生成客戶端驗證規則在生成的類型為agerange的ModelClientValidationRule 對象中包含三個參數(currentdateminage和maxage)分別表示當前日期(用於計算年齡)允許年齡的范圍
   
    : public class AgeRangeAttribute : RangeAttribute IClientValidatable
   
    : {
   
    :     public AgeRangeAttribute(int minimum int maximum)
   
    :         : base(minimum maximum)
   
    :     { }
   
    :
   
    :     public override bool IsValid(object value)
   
    :     {
   
    :         DateTime birthDate = (DateTime)value;
   
    :         DateTime age = new DateTime(DateTimeNowTicks birthDateTicks)
   
    :         return ageYear >= (int)thisMinimum && ageYear <= (int)thisMaximum;
   
    :     }
   
    :
   
    :     public override string FormatErrorMessage(string name)
   
    :     {
   
    :         return baseFormatErrorMessage(年齡
   
    :     }
   
    :
   
    :     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata ControllerContext context)
   
    :     {
   
    :         ModelClientValidationRule validationRule = new ModelClientValidationRule(){ ValidationType = agerange ErrorMessage= FormatErrorMessage(metadataDisplayName)};
   
    :         validationRuleValidationParametersAdd(currentdateDateTimeTodayToString(ddMMyyyy))
   
    :         validationRuleValidationParametersAdd(minagethisMinimum)
   
    :         validationRuleValidationParametersAdd(maxagethisMaximum)
   
    :         yield return validationRule;
   
    :     }
   
    : }
   
 注冊客戶端驗證方法
   
    由於ASPNET MVC采用JQuery Validation進行客戶端驗證我們可以通過如下的這段javascript來注冊用於實現客戶端驗證的function和添加相應的adapter添加到jQueryvalidator的用於進行年齡范圍驗證的function具有三個參數(valueelementparams)分別表示被驗證的值元素和傳入的參數驗證邏輯必須的三個數值(當前日期年齡范圍最小和最大值)通過參數params獲得而該參數實際上是在添加adapter時從通過上面定義的GetClientValidationRules方法生成的驗證規則中獲取的
   
    : jQueryvalidatoraddMethod(agerange
   
    : function (value element params) {
   
    :
   
    :     var minAge = paramsminage;
   
    :     var maxAge = paramsmaxage;
   
    :
   
    :     var literalCurrentDate = paramscurrentdate;
   
    :     var literalBirthDate = value;
   
    :     var literalCurrentDates = literalCurrentDatesplit(
   
    :     var literalBirthDates = literalBirthDatesplit(
   
    :
   
    :     var birthDate = new Date(literalBirthDates[] literalBirthDates[] literalBirthDates[])
   
    :     var currentDate = new Date(literalCurrentDates[] literalCurrentDates[] literalCurrentDates[])
   
    :     var age = currentDategetFullYear() birthDategetFullYear()
   
    :     return age >= minAge && age <= maxAge
   
    : })
   
    :
   
    : jQueryvalidatorunobtrusiveadaptersadd(agerange [currentdate minage maxage] function (options) {
   
    :     optionsrules[agerange] = {
   
    :         currentdate: optionsparamscurrentdate
   
    :         minage: optionsparamsminage
   
    :         maxage: optionsparamsmaxage
   
    :     };
   
    :     ssages[agerange] = ssage;
   
    : })


   
AgeRangeAttribute的應用
   
    現在我們將AgeRangeAttribute 應用到一個簡單的ASPNET MVC應用中在通過VS的ASPNET MVC項目模板創建的空Web應用中我們定義了如下一個簡單的Person類型我們定義的AgeRangeAttribute 應用到了表示出生日期的BirthDate上並將允許的年齡上下限設置為
   
    : public class Person
   
    : {
   
    :     [DisplayName(姓名)]
   
    :     public string Name { get; set; }
   
    :
   
    :     [AgeRange( ErrorMessage = {}必須在{}和{}之間!)]
   
    :     [DisplayName(出生日期)]
   
    :     [DisplayFormat(ApplyFormatInEditMode = true DataFormatString = {:ddMMyyyy})]
   
    :     public DateTime? BirthDate { get; set; }
   
    : }
   
    然後我們添加如下一個HomeController在默認的Action方法Index中我們將創建的Person對象呈現在默認的View中
   
    : public class HomeController : Controller
   
    : {
   
    :     public ActionResult Index()
   
    :     {
   
    :         return View(new Person{ BirthDate = DateTimeToday Name = Foo})
   
    :     }
   
    :     [HttpPost]
   
    :     public ActionResult Index(Person person)
   
    :     {
   
    :         return View(person)
   
    :     }
   
    : }
   
    如下所示的代碼片斷代表了View的定義我們直接調用HtmlHelper<TModel>的擴展方法EditorModel將作為Model的Person對象以編輯模式呈現在一個表單中最後一點不要忘了在Layout文件中講包含上述javascript片斷的js文件包含進來
   
    : @model Person
   
    : @using (HtmlBeginForm())
   
    : {
   
    :     @HtmlEditorForModel()
   
    :     <input type=submit value=Save />
   
    : }
   
    運行我們的程序輸入不合法出生日期並點擊Save按鈕提交表單(針對第一次客戶端驗證)客戶端驗證將會生效具體效果如下圖所示


From:http://tw.wingwit.com/Article/program/net/201311/11619.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.