模型绑定时,属性是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; }
你传过去的值有不能转换成int的情况,就别用int来装这个值,如果一定要用int,那就保证你传过去的值一定要能转成int。至于如何保证传过去的值一定是int,你可以在前端输入是就验证,或者在后端已进入方法食就验证。
我只是想覆盖这个默认的信息【值XXX对属性名无效】,或者如何重写。。。
[Display(Name = "分类Id")] [Required(ErrorMessage = "请输入正确的数字")]//验证不能为空 [RegularExpression(@"^[1-9]\d*$", ErrorMessage = "请输入正确的数字")]//通过正则表达式验正值为数字 public int TypeId { get; set; }
@程序人生,永无止境: ......
我一开始都这样写的,却不管用,现在又好了。。。
@期待Ing: 更改了模型类里的哪怕只是一个字,都需要迁移数据库才能生效的。
public class Product { public string Title { get; set; } [IsNumber] [Display(Name="分类ID")] public string TypeId { get; set; } }
把int改成string试试
这修改类,不方便吧。