加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC – 值类型的自定义验证消息

发布时间:2020-12-15 18:46:43 所属栏目:asp.Net 来源:网络整理
导读:当我使用UpdateModel或TryUpdateModel时,MVC框架足够聪明,可以知道您是否尝试将null转换为值类型(例如用户忘记填写所需的出生日期字段)。 不幸的是,我不知道如何覆盖默认消息,“需要一个值”。在总结中变成更有意义的东西(“请输入你的出生日”)。 必须
当我使用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();

干杯!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读