ASP.NET MVC:ValidationAttribute和本地化的ErrorMessage

时间:2009-09-26 14:55:46

标签: asp.net-mvc

我有ValidationAttribute,如:

    public class Username : ValidationAttribute
 {
  public override bool IsValid(object value)
  {
   if (value == null)
    return false;

   return RegExp.Validate(RegExpLib.Username,value.ToString());
  }
 }

..并像这样使用它:

    public class AccountSignIn
 {
  [Username(ErrorMessageResourceName ="txtUsername",ErrorMessageResourceType=typeof(SignIn))]
  public string Username { get; set; }

  public string Password { get; set; }

  public bool RememberMe { get; set; }

  public string ReturnUrl { get; set; }
 }

SignIn是App_GlobalResources的资源文件,“txtUsername” - 是资源文件中的字符串名称。

问题: 错误消息未显示。

问题: 如果网站上的语言很少,如何设置错误消息。

另一个信息:

我可以从Views或项目中的任何文件访问SignIn.txtUsername。来自控制器

ModelState.AddModelError("Username", Resources.SignIn.txtUsername);

工作正常..我可以在ValidationAttribute中分配ErrorMessage,但在第二次验证后得到错误尝试...如果我这样检查 -

   if(ErrorMessage != Resources.SignIn.txtUsername)
       ErrorMessage = Resources.SignIn.txtUsername; 

切换到另一种语言后出错 - ErrorMessage只能分配一次。

请告知我如何解决它。

提前谢谢。

3 个答案:

答案 0 :(得分:10)

我在使用本地化错误消息和DataAnnotations方面遇到了一些问题,与您的情况非常相似。虽然我最终没有将空白显示为错误消息,但我总是抛出一些异常。我的解决方案是:

  1. 在App_GlobalResources / Errors.resx中打开资源文件,将其属性更改为Build Action:Embedded Resource,Custom Tool:PublicResXFileCodeGenerator,Custom Tool Namespace:Resources(visual studio在自动生成这些内容时做了一些奇怪的事情,所以请回来查看再一次,事情还可以)

  2. 将资源文件的访问修饰符更改为Public

  3. 从生成的代码文件(Errors.Designer.cs)中检查命名空间和访问修饰符是否正确。

  4. 试一试

  5. 我在Model类中的例子:

    [Required(ErrorMessageResourceType = typeof(Resources.Errors), ErrorMessageResourceName="ResponseMessageRequired")]
    public string message { get; set; }
    

答案 1 :(得分:1)

在资源编辑器中确保您的资源可见性设置为“公共”而不是“内部”。否则,DataAnnotations完成的反射将不起作用。

答案 2 :(得分:0)

这个问题看起来很旧。 在我的MVC3项目中使用resx(我的错误消息存储)作为属性参数类型时,我遇到了类似的问题。

这解决了我的问题:

  • 将“Messages.resx” - 文件属性“Build Action”设置为“Embedded Resource”
  • 更改属性参数如下: [Range(0, 999, ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "ERR_NUM_NOT_IN_RANGE")]

希望这有帮助。