asp.net мвк вход / проверка модели многоязычность - PullRequest
7 голосов
/ 19 октября 2010

Я довольно новичок в asp.net mvc, и точно знаю, что я пытаюсь найти хорошую практику для проверки ввода.

В проекте мы собираемся использовать инфраструктуру сущностей,где вы можете добавлять аннотации данных к свойствам следующим образом:

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

Это довольно хорошо, однако у нас есть многоязычный веб-сайт (как и большинство веб-сайтов), поэтому мы не можем отображать только сообщения об ошибках.по-английски.Какой может быть способ решить это?Могу ли я изменить это сообщение об ошибке @runtime, в зависимости от языка пользователя?Должен ли я использовать проверку Jquery на стороне клиента?

Спасибо за ввод.

Обновление Я пробовал код на веб-сайте Фила Хаака. Это будет работать со статическими ресурсами, однако мы используемресурсы, которые поступают из базы данных, а не статические ресурсы.

Если я заполняю следующее для аннотаций данных:

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

Тогда я получаю следующую ошибку: Тип ресурса 'CustomResourceProviders.DBResourceProviderFactory'не имеет доступного статического свойства с именем '1277'.

Конечно, такого свойства нет, к нему должна обращаться функция.Есть идеи, что я могу с этим сделать?TNX

Ответы [ 3 ]

8 голосов
/ 15 июля 2011

Вы можете наследовать пользовательский атрибут от RequiredAttribute и установить собственное локализованное сообщение для свойства ErrorMessage .Это может выглядеть так:

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

    }
}

также, и вы наследуете от DisplayNameAttribute и переопределяете DisplayName свойство:

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

также вы можетесоздайте свои пользовательские атрибуты проверки, которые наследуются от ValidationAttribute class.

3 голосов
/ 19 июля 2011

Взгляните на этот пост, http://helios.ca/2010/02/17/asp-net-mvc-2-model-validation-with-localization/ хороший блог по проблеме

2 голосов
/ 19 октября 2010

Фил Хаак написал хорошее сообщение в блоге , в котором рассказывается, как это сделать.По сути, это почти то же самое, за исключением того, что вы используете файлы ресурсов для предоставления сообщений.

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