【问题标题】:ASP.NET MVC: ValidationAttribute and localized ErrorMessageASP.NET MVC:ValidationAttribute 和本地化的 ErrorMessage
【发布时间】:2009-09-26 14:55:45
【问题描述】:

我有类似的 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” - 是资源文件中的字符串名称。

问题: 不显示错误消息。

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

其他信息:

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

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

也可以正常工作。我可以在 ValidationAttribute 中分配 ErrorMessage,但在第二次验证尝试后出错...如果我像这样放置检查 -

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

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

我该如何解决?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

    1. 在 App_GlobalResources/Errors.resx 中打开资源文件,将其属性更改为构建操作:嵌入式资源、自定义工具:PublicResXFileCodeGenerator、自定义工具命名空间:资源(Visual Studio 在自动生成这些时做了一些奇怪的事情,所以请回来查看再次表示一切正常)

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

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

    4. 试试看

    我的模型类示例:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 正如我所写,我正在使用全局资源“登录是 App_GlobalResources 的资源文件”
      • 很遗憾,您无法公开 App_GlobalResources 中的资源。您必须改用“属性”文件夹中的资源文件 - 右键单击​​项目,选择属性,从左侧菜单中选择“资源”并单击“此项目...”。将创建名为“Resources.resx”的默认资源文件。您可以重命名它(即“ModelErrors”)并在代码中使用:[Required(ErrorMessageResourceName = "Password_Required", ErrorMessageResourceType = typeof(Properties.ModelErrors))]
      • 是的,没错。 DataAnnotations 的存在是为了在 ASP.NET 之外使用,因此它们对 App_XxxResources 一无所知,只使用传统的资源文件。
      【解决方案3】:

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

      这解决了我的问题:

      • 将“Messages.resx” - 文件属性“构建操作”设置为“嵌入式资源”
      • 更改属性参数如下: [Range(0, 999, ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "ERR_NUM_NOT_IN_RANGE")]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 2011-06-07
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多