PublicResxFileCodeGenerator

PublicResxFileCodeGenerator

为什么DataAnnotation属性很难访问PublicResxFileCodeGenerator创建的资源?

我发现以下属性:

[Compare("NewPassword", ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", ErrorMessageResourceType = typeof(Resources.Global))]

如果资源是使用PublicResxFileCodeGenerator创建的,将找不到该资源。但是,使用GlobalResourceProxyGenerator创建的相同资源将正常工作。这两个资源文件都设置为Content,并且位于App_GlobalResources中。我也尝试将默认语言放入App_LocalResources中,但这似乎没有什么区别。
我的测试是我的辅助语言(GlobalResourceProxyGenerator)可以工作,但是我的主要语言(PublicResxFileCodeGenerator)引发了异常(无法找到资源文件)。如果我都将它们都切换到GlobalResourceProxyGenerator,那么一切都很好(但显然没有公共(public)访问权限)。

有人知道为什么吗?我想将来将资源移到另一个程序集中。

最佳答案

那是因为您将资源文件放置在App_GlobalResources文件夹内,该文件夹是ASP.NET中的特殊文件夹。如果将资源文件放在其他位置,这应该可以工作。这也可能是与ASP.NET MVC应用程序完全独立的项目。

您可以按照以下步骤进行操作:

  • 使用默认的Internet模板
  • 创建一个新的ASP.NET MVC 3应用程序
  • 添加一个包含~/Messages.resx资源字符串
  • RegisterModel_ConfirmPasswordError文件
  • 将此资源文件的定制工具设置为PublicResXFileCodeGenerator:

  • 添加模型:
    public class MyViewModel
    {
        [Compare("NewPassword",
                 ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError",
                 ErrorMessageResourceType = typeof(MvcApplication1.Messages))]
        public string Password { get; set; }
    
        public string NewPassword { get; set; }
    }
    
  • Controller :
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new MyViewModel());
        }
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            return View(model);
        }
    }
    
  • 查看:
    @model MyViewModel
    
    @using (Html.BeginForm())
    {
        <div>
            @Html.LabelFor(x => x.Password)
            @Html.EditorFor(x => x.Password)
            @Html.ValidationMessageFor(x => x.Password)
        </div>
    
        <div>
            @Html.LabelFor(x => x.NewPassword)
            @Html.EditorFor(x => x.NewPassword)
            @Html.ValidationMessageFor(x => x.NewPassword)
        </div>
    
        <button type="submit">OK</button>
    }
    

  • 然后,您可以通过提供相应的翻译开始本地化:
  • Messages.fr-FR.resx
  • Messages.de-DE.resx
  • Messages.it-IT.resx
  • Messages.es-ES.resx
  • ...


  • 更新:

    在评论部分,有人问我App_GlobalResources文件夹有什么特别之处,以及为什么它不起作用。好吧,实际上您可以使其工作。您需要做的就是将Build Action设置为Embedded Resource。默认情况下,当您将文件添加到App_GlobalResources文件夹时,Visual Studio会将其设置为Content,这意味着该资源将不会合并到运行时程序集中,而ASP.NET MVC找不到它:

    07-26 06:58