Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

asp.net mvc input / model validation multi language

I'm quite new to asp.net mvc, and right know I'm trying to find out a good practise to do input validation.

In the project we're going to use entity framework, where you can add data annotations to properties in the following way:

[Required(ErrorMessage = "Please enter a product name")]
[Column]
public string Name { get; set; }

This is quite nice, however we have a multi language website (like most websites), so we can't only show the error messages in English. What can be a way to solve this? Can I change this errormessage @runtime, depending on the user's language? Should I use Jquery client side validation?

Thanks for the input.

Update I've tried the code on the website of Phil Haack This will do the trick with static resources however, we use resources that come from a database not static resources.

If I fill in the following for the dataannotations:

   [MetadataType(typeof(IncidentsMetaData))]
public partial class INCIDENTS
{
    private class IncidentsMetaData
    {
        [Required(ErrorMessageResourceType = typeof(CustomResourceProviders.DBResourceProviderFactory),
            ErrorMessageResourceName="1277")]
        public string SUBJECT { get; set; }
    }
}

Then I get the following error: The resource type 'CustomResourceProviders.DBResourceProviderFactory' does not have an accessible static property named '1277'.

Of course there is no such property, it should be accessed by a function. Any idea what I could do about this? tnx

like image 626
denappel Avatar asked Oct 19 '10 08:10

denappel


3 Answers

You can inherit custom attribute from RequiredAttribute and set your own localized message for property ErrorMessage. It can looks like this:

public class LocalizedRequiredAttribute : RequiredAttribute
{
    public LocalizedRequiredAttribute()
        : base()
    {
        // prefix for the selection of localized messages from datebase
        // e.x. for "Required" string, localized messages will be: "RuRequired", "EnRequired"
        var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;

        // logic to get value from datebase
        // e.x. using Linq2Sql
        using (var context = new dateBaseContext())
        {
            var query = (from x in context.LocalizedStrings
                         where x.NameKey == currentCulture + "Required"
                         select x.NameValue).SingleOrDefault();

            if (query != null)
            {
                base.ErrorMessage = query;
            }
            else
            {
                base.ErrorMessage = "UndefinedName";
            }
        }            

    }
}

also and you inherit from DisplayNameAttribute and override DisplayName property:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    public LocalizedDisplayNameAttribute(string displayNameKey)
        : base(displayNameKey)
    {
    }

    public override string DisplayName
    {
        get
        {
            if (!string.IsNullOrEmpty(base.DisplayName))
            {
                // prefix for the selection of localized messages from datebase
                // e.x. if DisplayName is "Country", localized messages will be: "RuCountry", "EnCountry"
                var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;

                // logic to get value from datebase
                // e.x. using Linq2Sql
                using (var context = new dateBaseContext())
                {
                    var query = (from x in context.DisplayNames
                                 where x.DisplayNameKey == currentCulture + base.DisplayName
                                 select x.DisplayNameValue).SingleOrDefault();

                    if (query != null)
                    {
                        return query;
                    }

                    return base.DisplayName;
                }
            }

            return "UndefinedName";
        }
    }
}

also you can create your custom validation attributes that inherits from ValidationAttribute class.

like image 113
Boo Avatar answered Oct 23 '22 11:10

Boo


Take a look at this post, http://helios.ca/2010/02/17/asp-net-mvc-2-model-validation-with-localization/ good blog on the problem

like image 24
Manatherin Avatar answered Oct 23 '22 12:10

Manatherin


Phil Haack has written a good blog post that covers how to do this. Essentially it is much the same except you use resource files to provide the messages.

[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Required")]
public string MyProperty{ get; set; }
like image 2
Andy Rose Avatar answered Oct 23 '22 12:10

Andy Rose