【问题标题】:Change default "The {0} field is required" (ultimate solution?)更改默认“需要 {0} 字段”(最终解决方案?)
【发布时间】:2011-05-21 04:36:11
【问题描述】:

美好的一天!

我有以下用于登录表单的 ViewModel 类:

using System.ComponentModel.DataAnnotations;

...

public class UserLogin : IDataErrorInfo
{           
    [Required]
    [DisplayName("Login")]
    public string Login { get; set; }

    [Required]
    [DisplayName("Password")]
    public string Password { get; set; }

    [DisplayName("Remember Me")]
    public bool RememberMe { get; set; }

    #region IDataErrorInfo Members

    // This will be a Model-level error
    public string Error
    {
        get
        {
            if (!WebUser.CanLogin(Login, Password))
            {
                return Resources.ValidationErrors.InvalidLoginPassword;
            }
            else
            {
                return String.Empty;
            }
        }
    }

    // All is handled by DataAnnotation attributes, just a stub for interface
    public string this[string columnName]
    {
        get
        {
            return string.Empty;
        }
    }
    #endregion

}

这个在Global.asax:

DefaultModelBinder.ResourceClassKey = "BinderMessages";
ValidationExtensions.ResourceClassKey = "BinderMessages";

资源文件BinderMessages.resx 放置在 App_GlobalResources 中,它有两个键 InvalidPropertyValue(有效)和 PropertyValueRequired,无效并给我默认消息。

问题:是否可以修改此消息,或者它与 DataAnnotations 相关联?

我找到了很多关于此的帖子,但没有解决方案。现在我只是回退到这个:

[Required(ErrorMessageResourceType = typeof(Resources.ValidationErrors), ErrorMessageResourceName = "Required")] 

【问题讨论】:

  • 但问题是,如果您将登录名和密码留空怎么办?程序因未设置对象而中止。
  • 你为什么这么认为?无论如何,模型绑定器都会实例化一个UserLogin 对象实例。
  • 快 5 年了,似乎仍然不适用。 global.asax中定义的资源文件中仍然只有4个key可以使用

标签: asp.net-mvc asp.net-mvc-2 viewmodel modelbinders


【解决方案1】:

您可以创建自定义ValidationAttribute,扩展RequiredAttribute 并在那里设置值。比如:

public class MyRequiredAttribute : RequiredAttribute
{
    public MyRequiredAttribute()
    {
         ErrorMessageResourceType = typeof(Resources.ValidationErrors);
         ErrorMessageResourceName = "Required";
    }
}

然后用你的自定义属性装饰你的模型。

默认消息编译成System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources.resources下资源文件中的DataAnnotations程序集,为RequiredAttribute_ValidationError=The {0} field is required.。因此,要回答您的问题,是的,该消息是 DataAnnotations 的一部分。

编辑:PropertyValueRequired 用于处理具有不可为空类型的空值的错误。如下所述PropertyValueInvalid用于类型转换错误。

【讨论】:

  • 感谢您的回复,这是一个比我更好的解决方案(您真的是指ActionFilterAttribute 而不是数据注释属性吗?)。有没有可能知道为什么它不起作用?
  • 哎呀,是的。对于那个很抱歉。我的意思是ValidationAttribute。已编辑。
  • 小注:InvalidPropertyValue在绑定值到对象字段失败(转换错误)时被调用,例如——当它不能将字符串值绑定到int模型字段时,这发生在之前验证。
  • 此解决方案正确显示我的默认英文资源,但在切换 UICulture 时不会切换为使用我的 *.es.resx。
  • 这似乎导致不再生成不显眼的验证。我怀疑这是因为 MVC 被硬编码为查找 Required 属性,而不是不那么脆弱的东西。
【解决方案2】:

我已经使用单例类来提供翻译。您仍然需要按照@bmancini 的建议派生所有属性​​。我的方法的好处是您可以使用多个字符串表(或切换翻译源),而无需修改任何其他逻辑。

由于我的博文比较大,我只提供一个链接: http://blog.gauffin.org/2010/11/simplified-localization-for-dataannotations/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多