我指的不是在 js 里手写验证规则.
我要的是前后台都能动态验证.
现在有一个需求如下:
不同的航空公司要求输入的用户信息不一样.
比如:
A航空公司,要求旅客输入证件号码, 儿童的出生日期必填,而且年龄在2 ~ 12 周岁之间.
B航空公司,要求旅客输入证件号码和性别.
C航空公司,要求所有旅客的出生日期必填, 儿童年龄在2 ~ 12 周岁之间.
因为航空公司数量很多,各个航空公司的要求可能会变化, 所以,我不能跟据航空公司来定义旅客信息实体.
我想问的是,有没办法在不同的场景下使用不同的验证规则?
另外,在旅客信息输入页面,是跟据用户所选成人/儿童数来生成旅客信息框.也就是说: 有没有办法对单独的一个实体指定不同的验证规则?
谢谢.
/// <summary>
/// 预计单价
/// </summary>
[RegularExpression(@"^\d{0,10}\.{0,1}(\d{1,2})?", ErrorMessage = "价格输入不正确,请输不小于0的0-10位数字,最多两位小数。")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F2}")]
public Double PreSalePrice
{
get;
set;
}
目前我们的验证是这么写的,具体的实现我不清楚
而且的确是动态的在验证
@醉今生: 止动态非彼动态.
@xling: 你要的是什么动态啊
@xling: 这个就能在输入时试试验证了
你自己 寫 驗證的RegularExpression 這些東西。然後,在裏面加入你的場景信息,比如 從配置文件里讀取,或則數據庫等。因為代碼是你自己寫,想怎麼驗證,就怎麼驗證,最好把你寫好的,放到一個屬性的標誌上哦。
使用企业库的验证模块可以实现你的需求!
MVC不是有自定义验证吗。可以满足你的需求
你应该是需要ValidationHelper这个东西吧。在System.Web.WebPages.dll里面,可以在View里面直接根据不同场景做不同的验证。
if (航空公司1){
Validation.RequireField("证件号码","出生日期");
} else if (航空公司2) {
......
} else if (航空公司3) {
.....
}
具体可以看这里
大哥,你這個是MVC4的啊!
@xling:
汗,System.Web.WebPages.dll 这个又不是mvc才能用的,人家这个有给webmatrix用的。你把这个升级到2.0就好啦。
@Timothy:
不是简单的升级吧, 我们现在的项目是 MVC3 的, 要升级这个项目要把整个项目升级成 MVC4 的吧,而 MVC4 还只是 Beta 版.
汗.
我装了MVC4 ,然后MVC3的项目就一堆错误.
动态的话,用ajax、。
我相信Timothy 说的,MVC4里的 System.Web.WebPages.dll 里提供了我要的功能.但是目前不考虑使用MVC4
我用 IValidatableObject 接口,加上 Html.TextBoxFor 和 htmlAttributes 来完成了,虽然笨拙了点,但是要求完成了.
如:
cshtml:
@if(!Model[i].IsAdult || (confs & ConfigEnum.BirthDay) == ConfigEnum.BirthDay) { //dateRangeRule.data_val_required = "必填"; @Html.LabelFor(m => m[i].BirthDay , LabelInShell.StarAfter) //@Html.TextBoxFor(m => m[i].BirthDay , (object)dateRangeRule) //, new { @data_val_required = "必填" }) @Html.TextBoxFor(m => m[i].BirthDay , new { @data_val_required = "必填" , @data_val_dateRange_min = min.ToString(dateFmt) , @data_val_dateRange_max = max.ToString(dateFmt) , @data_val_dateRange = @msg }) } else { @Html.LabelFor(m => m[i].BirthDay) @Html.TextBoxFor(m => m[i].BirthDay , new { @data_val_dateRange_min = min.ToString(dateFmt) , @data_val_dateRange_max = max.ToString(dateFmt) , @data_val_dateRange = @msg }) }
IValidatableObject 实现:
public System.Collections.Generic.IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { List<ValidationResult> results = new List<ValidationResult>(); if((RequiredConf & ConfigEnum.Nationality) == ConfigEnum.Nationality && string.IsNullOrWhiteSpace(this.Nation)) { results.Add(new ValidationResult("國家必填")); } ......... return results; }
Controller 内,手动验证
travellers.ForEach(t => { t.RequiredConf = confs; //必須一個一個驗證, var validationContext = new ValidationContext(t , null , null); var validationResults = new List<ValidationResult>(); Validator.TryValidateObject(t , validationContext , validationResults , false); validationResults.ForEach(r => { this.ModelState.AddModelError("" , r.ErrorMessage); }); //用这种方法, 像 PkgOrderNo 这样不在 Bind 的 Include 列表里的字段 也会被验证 //this.TryValidateModel(t); });