首页 新闻 会员 周边

asp.net MVC 模型验证时,重写或者覆盖【值XXX对属性名无效】

0
悬赏园豆:10 [已解决问题] 解决于 2016-12-22 16:07

模型绑定时,属性是int类型,这是post过来对应的属性值如果是不能转换为int类型会有这个【值XXX对属性名无效】,我想重写这个错误信息,我写了如下代码,代码也能正常执行,但ModelState.Values.Errors 的错误信息还是【值XXX对属性名无效】,请各位指点。测试代码如下:

 public class IsNumber : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
//如果输入的是非数字类的字符如"sdfaerf",此时value==null
if (value == null) { return false; } return true; } public override string FormatErrorMessage(string name) { string error = string.Format("{0}请输入正确的数字!", name); return error; } } //Model public class Product { public string Title { get; set; } [IsNumber] [Display(Name="分类ID")] public int TypeId { get; set; } } //Controller [HttpPost] public ActionResult Add(Product product) { string mess = string.Empty; if (!ModelState.IsValid) { var error = ModelState.Values.First(v => v.Errors.Count > 0); if(error.Errors.Count>0){ mess = error.Errors[0].ErrorMessage; return JavaScript("alert('" + mess + "');location.back(1);"); } } return View(product); }

=========================================

我临时解决方法如下:重写了DefaultModelBinder类的方法,感觉这样有点掩耳盗铃的意思,不知各位园友有什么其他的解决方法没。

        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {

            var result = base.BindModel(controllerContext, bindingContext);

            var propertyList = bindingContext.PropertyMetadata;
            foreach (var item in propertyList)
            {
                if (item.Value.ModelType == typeof(Nullable<int>) || item.Value.ModelType == typeof(int))
                {
                    if (bindingContext.ModelState.ContainsKey(item.Value.PropertyName))
                    {
                        bindingContext.ModelState.Remove(item.Value.PropertyName);
                        bindingContext.ModelState.AddModelError(item.Value.PropertyName, item.Value.DisplayName + "请输入正确的数字!");
                    }
                }

            }

            return result;
        }
期待Ing的主页 期待Ing | 初学一级 | 园豆:193
提问于:2016-12-22 09:29
< >
分享
最佳答案
0

你传过去的值有不能转换成int的情况,就别用int来装这个值,如果一定要用int,那就保证你传过去的值一定要能转成int。至于如何保证传过去的值一定是int,你可以在前端输入是就验证,或者在后端已进入方法食就验证。

收获园豆:10
龙行天涯 | 小虾三级 |园豆:1794 | 2016-12-22 14:40

我只是想覆盖这个默认的信息【值XXX对属性名无效】,或者如何重写。。。

期待Ing | 园豆:193 (初学一级) | 2016-12-22 14:59
        [Display(Name = "分类Id")]
        [Required(ErrorMessage = "请输入正确的数字")]//验证不能为空
        [RegularExpression(@"^[1-9]\d*$", ErrorMessage = "请输入正确的数字")]//通过正则表达式验正值为数字
        public int TypeId { get; set; }

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-22 15:41

@程序人生,永无止境: ......

我一开始都这样写的,却不管用,现在又好了。。。

期待Ing | 园豆:193 (初学一级) | 2016-12-22 16:06

@期待Ing: 更改了模型类里的哪怕只是一个字,都需要迁移数据库才能生效的。

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-22 16:10
其他回答(1)
0
    public class Product
    {
        public string Title { get; set; }
        [IsNumber]
        [Display(Name="分类ID")]
        public string TypeId { get; set; }
    }

把int改成string试试

刘宏玺 | 园豆:14020 (专家六级) | 2016-12-22 11:50

这修改类,不方便吧。

支持(0) 反对(0) 期待Ing | 园豆:193 (初学一级) | 2016-12-22 13:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册