更改默认值“{0}字段是必需的”(最终解决方案?)

时间:2010-12-06 19:37:44

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

美好的一天!

我使用了以下用于登录表单的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")] 

2 个答案:

答案 0 :(得分:6)

您可以创建扩展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用于类型转换错误。

答案 1 :(得分:1)

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

由于我的博客条目相当大,我只提供一个链接: http://blog.gauffin.org/2010/11/simplified-localization-for-dataannotations/