首页 新闻 会员 周边

MVC 动态验证

0
悬赏园豆:100 [已关闭问题] 关闭于 2012-05-23 08:52

我指的不是在 js 里手写验证规则.

我要的是前后台都能动态验证.

 

 

现在有一个需求如下:
不同的航空公司要求输入的用户信息不一样.
比如:
A航空公司,要求旅客输入证件号码, 儿童的出生日期必填,而且年龄在2 ~ 12 周岁之间.
B航空公司,要求旅客输入证件号码和性别.
C航空公司,要求所有旅客的出生日期必填, 儿童年龄在2 ~ 12 周岁之间.

因为航空公司数量很多,各个航空公司的要求可能会变化, 所以,我不能跟据航空公司来定义旅客信息实体.

我想问的是,有没办法在不同的场景下使用不同的验证规则?
另外,在旅客信息输入页面,是跟据用户所选成人/儿童数来生成旅客信息框.也就是说: 有没有办法对单独的一个实体指定不同的验证规则?

 

谢谢.

xling的主页 xling | 初学一级 | 园豆:6
提问于:2012-05-18 10:17
< >
分享
所有回答(8)
0

 /// <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;
        }

醉今生 | 园豆:23 (初学一级) | 2012-05-18 10:26

目前我们的验证是这么写的,具体的实现我不清楚

支持(0) 反对(0) 醉今生 | 园豆:23 (初学一级) | 2012-05-18 10:27

而且的确是动态的在验证

支持(0) 反对(0) 醉今生 | 园豆:23 (初学一级) | 2012-05-18 10:28

@醉今生: 止动态非彼动态.

支持(0) 反对(0) xling | 园豆:6 (初学一级) | 2012-05-18 10:41

@xling: 你要的是什么动态啊

支持(0) 反对(0) 醉今生 | 园豆:23 (初学一级) | 2012-05-18 11:08

@xling: 这个就能在输入时试试验证了

支持(0) 反对(0) 醉今生 | 园豆:23 (初学一级) | 2012-05-18 11:09
0

你自己 寫 驗證的RegularExpression 這些東西。然後,在裏面加入你的場景信息,比如 從配置文件里讀取,或則數據庫等。因為代碼是你自己寫,想怎麼驗證,就怎麼驗證,最好把你寫好的,放到一個屬性的標誌上哦。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-18 11:22
0

使用企业库的验证模块可以实现你的需求!

zhangweiwen | 园豆:904 (小虾三级) | 2012-05-18 15:47
0

MVC不是有自定义验证吗。可以满足你的需求

Hunt | 园豆:21 (初学一级) | 2012-05-18 16:57
0
dudu | 园豆:31003 (高人七级) | 2012-05-20 13:05
0

你应该是需要ValidationHelper这个东西吧。在System.Web.WebPages.dll里面,可以在View里面直接根据不同场景做不同的验证。

if (航空公司1){

Validation.RequireField("证件号码","出生日期");

} else if (航空公司2) {

......

} else if (航空公司3) {

.....

}

具体可以看这里

http://susucms.svn.sourceforge.net/viewvc/susucms/SusuCMS.Web/Widgets/Blog.Contact/Widget.cshtml?revision=343&view=markup

Timothy | 园豆:157 (初学一级) | 2012-05-20 13:17

大哥,你這個是MVC4的啊!

支持(0) 反对(0) xling | 园豆:6 (初学一级) | 2012-05-20 22:56

@xling: 

汗,System.Web.WebPages.dll 这个又不是mvc才能用的,人家这个有给webmatrix用的。你把这个升级到2.0就好啦。

支持(0) 反对(0) Timothy | 园豆:157 (初学一级) | 2012-05-20 23:00

@Timothy: 

不是简单的升级吧, 我们现在的项目是 MVC3 的, 要升级这个项目要把整个项目升级成 MVC4 的吧,而 MVC4 还只是 Beta 版.

汗.

我装了MVC4 ,然后MVC3的项目就一堆错误.

支持(0) 反对(0) xling | 园豆:6 (初学一级) | 2012-05-21 18:27
0

动态的话,用ajax、。

不懂cc | 园豆:877 (小虾三级) | 2012-05-20 20:25
0

我相信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);                
            });
xling | 园豆:6 (初学一级) | 2012-05-23 08:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册