ASP
NET MVC通過Model驗證幫助我們很容易的實現對數據的驗證
在默認的情況下
基於ValidationAttribute的聲明是驗證被使用
我們只需要將相應的ValidationAttribute應用到Model的類型或者屬性上即可
對於自定義驗證
我們也只需要定義相應的Validation就可以了
不過服務端驗證比較簡單
而客戶端驗證就要稍微復雜一些
本文提供一個簡單的實例說明在ASP
NET MVC中實現自定義驗證的基本步驟
一AgeRangeAttribute
用於驗證出生日期字段以確保年齡在制定的范圍之內的AgeRangeAttribute定義如下
簡單起見
我們直接讓它直接繼承自RangeAttribute
服務端驗證邏輯定義在重寫的IsValid方法中
並且重寫了FormatErrorMessage方法以便生成針對年齡的驗證消息
AgeRangeAttribute實現了IClientValidatable接口
並在實現的GetClientValidationRules方法中生成客戶端驗證規則
在生成的類型為
agerange
的ModelClientValidationRule 對象中包含三個參數(currentdate
minage和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(DateTime
Now
Ticks
birthDate
Ticks)
: return age
Year >= (int)this
Minimum && age
Year <= (int)this
Maximum;
: }
:
: public override string FormatErrorMessage(string name)
: {
: return base
FormatErrorMessage(
年齡
)
: }
:
: public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata
ControllerContext context)
: {
: ModelClientValidationRule validationRule = new ModelClientValidationRule(){ ValidationType =
agerange
ErrorMessage= FormatErrorMessage(metadata
DisplayName)};
: validationRule
ValidationParameters
Add(
currentdate
DateTime
Today
ToString(
dd
MM
yyyy
))
: validationRule
ValidationParameters
Add(
minage
this
Minimum)
: validationRule
ValidationParameters
Add(
maxage
this
Maximum)
: yield return validationRule;
: }
: }
二注冊客戶端驗證方法
由於ASP
NET MVC采用JQuery Validation進行客戶端驗證
我們可以通過如下的這段javascript來注冊用於實現客戶端驗證的function和添加相應的adapter
添加到jQuery
validator的用於進行年齡范圍驗證的function具有三個參數(value
element
params)分別表示被驗證的值
元素和傳入的參數
驗證邏輯必須的三個數值(當前日期
年齡范圍最小和最大值)通過參數params獲得
而該參數實際上是在添加adapter時從通過上面定義的GetClientValidationRules方法生成的驗證規則中獲取的
: jQuery
validator
addMethod(
agerange
: function (value
element
params) {
:
: var minAge = params
minage;
: var maxAge = params
maxage;
:
: var literalCurrentDate = params
currentdate;
: var literalBirthDate = value;
: var literalCurrentDates = literalCurrentDate
split(
)
: var literalBirthDates = literalBirthDate
split(
)
:
: var birthDate = new Date(literalBirthDates[
]
literalBirthDates[
]
literalBirthDates[
])
: var currentDate = new Date(literalCurrentDates[
]
literalCurrentDates[
]
literalCurrentDates[
])
: var age = currentDate
getFullYear()
birthDate
getFullYear()
: return age >= minAge && age <= maxAge
: })
:
: jQuery
validator
unobtrusive
adapters
add(
agerange
[
currentdate
minage
maxage
]
function (options) {
: options
rules[
agerange
] = {
: currentdate: options
params
currentdate
: minage: options
params
minage
: maxage: options
params
maxage
: };
: ssages[
agerange
] = ssage;
: })
三AgeRangeAttribute的應用
現在我們將AgeRangeAttribute 應用到一個簡單的ASP
NET MVC應用中
在通過VS的ASP
NET MVC項目模板創建的空Web應用中
我們定義了如下一個簡單的Person類型
我們定義的AgeRangeAttribute 應用到了表示出生日期的BirthDate上
並將允許的年齡上
下限設置為
和
: public class Person
: {
: [DisplayName(
姓名
)]
: public string Name { get; set; }
:
: [AgeRange(
ErrorMessage =
{
}必須在{
}和{
}之間!
)]
: [DisplayName(
出生日期
)]
: [DisplayFormat(ApplyFormatInEditMode = true
DataFormatString =
{
:dd
MM
yyyy}
)]
: public DateTime? BirthDate { get; set; }
: }
然後我們添加如下一個HomeController
在默認的Action方法Index中我們將創建的Person對象呈現在默認的View中
: public class HomeController : Controller
: {
: public ActionResult Index()
: {
: return View(new Person{ BirthDate = DateTime
Today
Name =
Foo
})
: }
: [HttpPost]
: public ActionResult Index(Person person)
: {
: return View(person)
: }
: }
如下所示的代碼片斷代表了View的定義
我們直接調用HtmlHelper<TModel>的擴展方法EditorModel將作為Model的Person對象以編輯模式呈現在一個表單中
最後一點不要忘了在Layout文件中講包含上述javascript片斷的js文件包含進來
: @model Person
: @using (Html
BeginForm())
: {
: @Html
EditorForModel()
: <input type=
submit
value=
Save
/>
: }
運行我們的程序
輸入不合法出生日期並點擊
Save
按鈕提交表單(針對第一次客戶端驗證)
客戶端驗證將會生效
具體效果如下圖所示
From:http://tw.wingwit.com/Article/program/net/201311/11619.html