Westwind.Globalization 带 Account.cs ASP.NET MVC 的框架

Westwind.Globalization Framework w/ Account.cs ASP.NET MVC

我在 Account.CS 文件中声明资源时遇到问题。这是我的代码:

    [Required(ErrorMessageResourceName= typeof @DbRes.T("Account", "EmailAddress")]
    [Required(ErrorMessageResourceName = (@DbRes.T("EmailAddress", "Account")))]
    [DataType(DataType.EmailAddress)]
    [Display(Name = DbRes.T("EmailAddress", "Account"))]
    public string EmailAddress { get; set; }

Westwind Documentation: Westwind.Globalization ASP.NET MVC Support 说:

MVC applications work best by NOT using the ASP.NET resource architecture of App_LocalResources and App_GlobalResources. Because MVC doesn't use controls any of the control lookup benefits of declarative markup that the Web Forms based provider system provides is lost in MVC applications. Instead MVC applications tend to work best with traditional resources defined in your .NET projects and exposed as strongly typed resources.

所以看起来 Westwind 似乎没有解决方案,除了使 RESX 文件编辑可能更容易。

//编辑: 请参阅 Ricks 评论:[...]您可以从数据库资源生成强类型资源,然后以相同的方式使用它们。 [...] Wiki.

上有一个单独的主题

您绝对可以将 Westwind.Globalization 用于 MVC 和验证属性。 MVC 验证依赖于强类型资源和类型映射,因此为了让它工作 you have export strongly typed resources from your dbResource file。这将为您的数据库资源中的每个 ResourceSet 创建一个自定义的强类型 class。

强类型资源 class 如下所示:

public class Resources
{
    public static System.String NameIsRequired
    {
        get
        {
            if (GeneratedResourceSettings.ResourceAccessMode == ResourceAccessMode.AspNetResourceProvider)
                return (System.String) HttpContext.GetGlobalResourceObject("Resources","NameIsRequired");
            if (GeneratedResourceSettings.ResourceAccessMode == ResourceAccessMode.Resx)
                return ResourceManager.GetString("NameIsRequired");

            return DbRes.T("NameIsRequired","Resources");
        }
    }


    public static System.String AddressIsRequired
    {
        get
        {
            if (GeneratedResourceSettings.ResourceAccessMode == ResourceAccessMode.AspNetResourceProvider)
                return (System.String) HttpContext.GetGlobalResourceObject("Resources","AddressIsRequired");
            if (GeneratedResourceSettings.ResourceAccessMode == ResourceAccessMode.Resx)
                return ResourceManager.GetString("AddressIsRequired");

            return DbRes.T("AddressIsRequired","Resources");
        }
    }

    ... any others in the same resource set
}

这与标准 .Resx 强类型 classes 非常相似,除了您可以使用相同的 class 访问各种不同类型的资源(DbRes ResourceManager,dbRes ASP.NET ResourceProvider 或纯 Resx。

然后您可以像在 ASP.NET MVC 模型验证属性中引用标准 Resx 强类型资源一样引用强类型资源:

public class ViewModelWithLocalizedAttributes
{
    [Required(ErrorMessageResourceName = "NameIsRequired", ErrorMessageResourceType = typeof(Resources))]
    public string Name { get; set; }

    [Required(ErrorMessageResourceName = "AddressIsRequired", ErrorMessageResourceType = typeof(Resources))]
    public string Address { get; set; }
}

示例项目中有一个示例 - 打开模型文件夹以查看模型和使用具有本地化值的视图的 ModelAttributesFromResources.cshtml 视图。

wiki 上有一个主题也描述了这一点:

https://github.com/RickStrahl/Westwind.Globalization/wiki/Model-Validation-Message-for-ASP.NET-and-EntityFramework