Каков наилучший способ локализации ошибок аннотации данных в ASP.NET MVC 3? - PullRequest
5 голосов
/ 18 апреля 2011

С аннотациями данных теперь легко локализовать сообщения об ошибках, используя файлы Resource.resx, например, такие:

public class Student
{
    . . .

    [Required(ErrorMessageResourceName ="Required",
     ErrorMessageResourceType = typeof(StudentResources))]
    [StringLength(16)] 
    [Display(Name = "FirstName", ResourceType = typeof(StudentResources))]
    public string FirstName { get; set; }

    . . .
}

Теперь, допустим, я хочу проверить, выполнил ли студент Платеж за данный месяц и год:

public bool CheckIfAlreadyPaid(Payment payment)
{
    return repository.GetPayments().Any(p => p.StudentId == payment.StudentId &&
                                        p.Month == payment.Month &&
                                        p.Year == payment.Year);
}

Если он уже произвел Платеж, я делаю следующее в слое «Услуги»:

if (CheckIfAlreadyPaid(payment))
{
    modelState.AddModelError("AlreadyPaid",
    Resources.Views.Payment.PaymentCreateResources.AlreadyPaid);
}

Это работает, но я не уверен в том, что смогу сослаться на файл Resource в слое Services.

Существует ли стандартный или лучший способ локализации сообщений об ошибках, которые не привязаны к свойствам модели (аннотации данных) - ошибки, возникающие из правил бизнес-логики? Стоит ли мне добавить эти ошибки в ModelStateDictionary?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2011

Я сделал это по-другому.Слой Service используется для проверки того, была ли оплата уже произведена.В моем Controller я добавляю сообщение об ошибке проверки к объекту ModelState, передавая ему локализованный строковый ресурс.Теперь я чувствую себя более комфортно с таким подходом.

Вот код:

/// <summary>
/// Performs validation of business logic...
/// </summary>
/// <param name="payment"></param>
/// <returns></returns>
private bool ValidatePayment(Payment payment)
{
    if (paymentService.IsPaymentMade(payment))
    {
        ModelState.AddModelError("AlreadyPaid", Localization.AlreadyPaid);
    }

    return ModelState.IsValid;
}

РЕДАКТИРОВАТЬ:

Чтобы дополнить свой ответ, я только что нашелсегодня ValidationSummary @Html.ValidationSummary(true) делает именно то, что я хочу:

Html.ValidationSummary возвращает неупорядоченный список (элемент ul) сообщений проверки, которые находятся в объекте ModelStateDictionary иОпционально отображаются только ошибки уровня модели.

Я передаю true, и в сводке только в верхней части страницы будут отображаться только ошибки уровня модели (не аннотации данных).,Это здорово, но только если это сработает ...:)

Я столкнулся с проблемой, когда мои пользовательские сообщения об ошибках, не привязанные к свойствам модели, не появлялись, когда я установил ValidationSummary(true).Затем я искал с помощью Google и нашел этот пост .Я попробовал его решение, но оно не сработало.Затем я немного больше искал и нашел эту ссылку в Google Книгах (Pro ASP.NET MVC 2 Framework от Стивена Сандерсона).

Я попытался описать пустую строку какключ (string.Empty), и он сделал свою работу.

if(paymentService.IsPaymentMade(payment))
{
    ModelState.AddModelError(string.Empty, Localization.PaymentAlreadyCreated);
}
0 голосов
/ 18 апреля 2011

Я согласен, я не думаю, что это должно быть на уровне обслуживания.Похоже, что его можно либо поместить в пользовательский атрибут проверки данных, либо обработать каким-либо другим подходом на этом уровне (использование Свободная проверка может быть хорошим вариантом).В любом случае, я думаю, что пока проверка остается в самом приложении MVC, вы можете спокойно использовать файлы ресурсов для хранения сообщений.

...