MVC3 модифицирует метаданные проверки модели и сообщения об ошибках - PullRequest
0 голосов
/ 30 октября 2011

Мне нужно решение для логики проверки модели ASP.NET MVC3.У меня есть собственное решение для локализации, и я передаю все строки через метод перевода, что-то вроде этого:

    @Localizer.Translate("Hello world!") 

Примечание: я не уверен, но я думаю, что этот подход исходит из логики локализации QT.WordPress также использует технику smillar.

Когда я пытаюсь применить это решение для таких атрибутов проверки модели, как:

    [Required(ErrorMessage = Localizer.Translate( "Please enter detail text!"))]
    [DisplayName(Localizer.Translate( "Detail"))]
    public string Details { get; set; }

, компилятор выдаёт мне эту ошибку:

Ошибка 1Аргументом атрибута должно быть константное выражение, выражение typeof или выражение создания массива типа параметра атрибута ...

Итак, я попытался изменить сообщения об ошибках и атрибуты DisplayName на лету, но не смог.

Есть ли способ сделать это?Если есть, это может быть спасением для меня:)

Ответы [ 3 ]

1 голос
/ 30 октября 2011

Вы можете использовать файлы ресурсов для локализации .

Добавьте файл ресурсов (вы можете использовать мастер добавления нового элемента через Visual Studio - назовем его MyResourcesType.resx) в ваш проект. Затем добавьте свои сообщения проверки, как это:

[Required(
    ErrorMessageResourceType = typeof(MyResourcesType),
    ErrorMessageResourceName = "MyMessageIdOnTheResourcesFile")]

Отныне изменение языка - это просто вопрос добавления новых файлов ресурсов. Отметьте первый ответ на этот вопрос .

Кстати, не используйте DisplayNameAttribute , но DisplayAttribute из System.ComponentModel.DataAnnotations пространство имен. Это атрибут, используемый MVC, и вы также можете выполнять на нем локализацию:

[Display(
    ResourceType = typeof(MyResourcesType),
    Name = "MyPropertyIdOnResourcesFile_Name",
    ShortName = "MyPropertyIdOnResourcesFile_ShortName",
    Description = "MyPropertyIdOnResourcesFile_Description")]
0 голосов
/ 30 октября 2011

У меня есть обходной путь создания моего пользовательского помощника @ Html.LabelFor () и @ html.DescriptionFor ().

мой помощник:

namespace MyCMS.Helpers
{
public static class Html
{
    public static MvcHtmlString DescriptionFor<TModel, TValue>(
        this HtmlHelper<TModel> self, 
        Expression<Func<TModel, TValue>> expression)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
        var description = Localizer.Translate(metadata.Description);

        return MvcHtmlString.Create(string.Format(@"<span class=""help-block"">{0}</span>", description));
    }

    public static MvcHtmlString LabelFor<TModel, TValue>(
        this HtmlHelper<TModel> self, 
        Expression<Func<TModel, TValue>> expression, 
        bool showToolTip
    )
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
        var name = Localizer.Translate(metadata.DisplayName);

        return MvcHtmlString.Create(string.Format(@"<label for=""{0}"">{1}</label>", metadata.PropertyName, name));
    }
}
}

мой взгляд:

@ с использованием MyCMS.Localization;@using MyCMS.Helpers;

    <div class="clearfix ">
        @Html.LabelFor(model => model.RecordDetails.TitleAlternative)
        <div class="input">
            @Html.TextBoxFor(model => model.RecordDetails.TitleAlternative, new { @class = "xxlarge" })
            @Html.ValidationMessageFor(model => model.RecordDetails.TitleAlternative)
            @Html.DescriptionFor(model => model.RecordDetails.TitleAlternative)
        </div>
    </div>

и я могу использовать мой подход к локализации:)

Еще раз спасибо всем ...

0 голосов
/ 30 октября 2011

Атрибуты работают так, что они статически компилируются в код. Таким образом, вы не можете иметь никакой динамической функциональности, подобной этой, при использовании атрибутов.

Ответ Jota - рекомендуемый способ сделать что-то, однако если вы решили использовать свое собственное решение, вы можете создать свой собственный атрибут, и в этот атрибут вы можете добавить код, который просматривает сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...