MVC 3, NHIbernate Validators и Интерполатор сообщений - PullRequest
0 голосов
/ 08 марта 2011

Я следовал этой статье и прошел тест, показывающий, что пользовательские сообщения об ошибках проверки возвращаются из файла ресурса при сбое вызова Validator.IsValid (someEntity).

Я пытаюсь перевести это на новую ненавязчивую проверку на стороне клиента в MVC3, описанную этой статьей . Это также более или менее работает - хорошо, проверка на стороне клиента делает так, что я могу предположить, что моя проводка NHValidators хороша, поскольку вы можете видеть следующее:

<input data-val="true" data-val-required="{NotNullNotEmpty}" id="Username" name="Username" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="Username" data-valmsg-replace="true">

Моя проблема в том, что на этот раз CustomMessageInterpolator не сработал - строка ресурса не была переведена для этого свойства (она все еще в фигурных скобках): {NotNullNotEmpty}.

В моем тесте и в Интернете используется одна и та же конфигурация NHValidator:

var cfg = new FluentConfiguration();
cfg
.SetMessageInterpolator<CustomMessageInterpolator>()
.SetCustomResourceManager("MyProject.Core.Resources.ValidationMessages", Assembly.Load("MyProject.Core"))
.SetDefaultValidatorMode(ValidatorMode.UseAttribute)
.Register(Assembly.Load("MyProject.Core").ValidationDefinitions())

Для примера приведу фрагмент модели:

public class LoginModel
  {
    [NotNullNotEmpty(Message = "{NotNullNotEmpty}")]
    public string Username { get; set; }

Я знаю, но любые идеи будут оценены по достоинству!

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Можете ли вы показать свой код?Я полагаю, вы использовали какой-то кастом ModelValidatorProvider?

У меня есть кое-что, похожее на то, что вы описали.Для этого потребовалось написать пользовательские AssociatedValidatorProvider и ModelValidator в соответствии с описанием, приведенным здесь

http://weblogs.asp.net/srkirkland/archive/2010/07/20/nhibernate-client-validator-asp-net-mvc-2-model-validation.aspx

, но изменить метод MessageOrDefault в статье выше для использования NHibernate Validator DefaultMessageInterpolatorчтобы перевести сообщения.

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

0 голосов
/ 10 марта 2011

Мне не повезло с этим, разместив его на нескольких форумах.

В конце концов я вместо этого использовал DataAnnotations в моих моделях просмотра для проверки на стороне клиента.

Конечно, это действительно хакерское и ужасное "решение", поскольку в моем коде теперь есть два типа атрибутов проверки. (если интересно, да, я бы предпочел оставить свои атрибуты NH Validation 1. поскольку я все еще генерирую из них свою схему и 2. Мне нравится способ проверки NH перед фиксацией на БД, т.е. на стороне сервера).

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

Этот фрагмент кода показывает, как затем настроить пользовательские сообщения об ошибках:

  [DisplayResource(typeof(LabelResources))]
  public class NewChildTagViewModel : ModuleViewModel
  {
    public int ParentId { get; set; }

    [Required]
    public string Title { get; set; }

    [Range(1, 1000, ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = "Display_Order")]
    [Required]
    public int? DisplayOrder { get; set; }
  }
...