当我使用UpdateModel或TryUpdateModel时,MVC框架足够聪明,可以知道您是否尝试将null转换为值类型(例如用户忘记填写所需的出生日期字段)。
不幸的是,我不知道如何覆盖默认消息,“需要一个值”。在总结中变成更有意义的东西(“请输入你的出生日”)。
必须有一种方法(不需要编写太多的解决方法),但是我找不到。任何帮助?
编辑
此外,我猜这也是无效转换的问题,例如BirthDay =“你好”。
解决方法
通过扩展DefaultModelBinder来建立自己的ModelBinder:
public class LocalizationModelBinder : DefaultModelBinder
覆盖SetProperty:
base.SetProperty(controllerContext,bindingContext,propertyDescriptor,value); foreach (var error in bindingContext.ModelState[propertyDescriptor.Name].Errors. Where(e => IsFormatException(e.Exception))) { if (propertyDescriptor.Attributes[typeof(TypeErrorMessageAttribute)] != null) { string errorMessage = ((TypeErrorMessageAttribute)propertyDescriptor.Attributes[typeof(TypeErrorMessageAttribute)]).GetErrorMessage(); bindingContext.ModelState[propertyDescriptor.Name].Errors.Remove(error); bindingContext.ModelState[propertyDescriptor.Name].Errors.Add(errorMessage); break; } }
添加函数bool IsFormatException(Exception e)来检查Exception是否为FormatException:
if (e == null) return false; else if (e is FormatException) return true; else return IsFormatException(e.InnerException);
创建一个属性类:
[AttributeUsage(AttributeTargets.All,Inherited = false,AllowMultiple = false)] public class TypeErrorMessageAttribute : Attribute { public string ErrorMessage { get; set; } public string ErrorMessageResourceName { get; set; } public Type ErrorMessageResourceType { get; set; } public TypeErrorMessageAttribute() { } public string GetErrorMessage() { PropertyInfo prop = ErrorMessageResourceType.GetProperty(ErrorMessageResourceName); return prop.GetValue(null,null).ToString(); } }
[TypeErrorMessage(ErrorMessageResourceName = "IsGoodType",ErrorMessageResourceType = typeof(AddLang))] public bool IsGood { get; set; }
AddLang是一个resx文件,IsGoodType是资源的名称。
最后将其添加到Global.asax.cs Application_Start中:
ModelBinders.Binders.DefaultBinder = new LocalizationModelBinder();
干杯!