Search code examples
c#asp.net-mvcglobalizationwestwindwestwind-globalization

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


I'm having trouble declaring a resource in the Account.CS file. Here's my code:

    [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; }

Solution

  • You can definitely use Westwind.Globalization with MVC and on validation attributes. MVC validation relies on strongly typed resources and type mapping so in order to get this to work you have export strongly typed resources from your dbResource file. This will create a custom strongly typed class for each ResourceSet in your db resources.

    A strongly typed resource class looks like this:

    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
    }
    

    This is very similar to standard .Resx strongly typed classes, except that you can access various different kinds of resources using the same class (DbRes ResourceManager, dbRes ASP.NET ResourceProvider or plain Resx.

    You can then reference the strongly typed resources the same way you would reference standard Resx strongly typed resources in your ASP.NET MVC model validation attributes:

    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; }
    }
    

    There's an example in the sample project - open the Models folder to see the model and ModelAttributesFromResources.cshtml view that uses that view with localized values.

    There's a topic on the wiki that describes this as well:

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