4

Прежде всего, я должен сказать, что я понимаю, как проверка модели на основе данных на основе аннотаций работает в ASP.NET MVC4, и я успешно ее реализовал с помощью DataAnnotationsModelValidatorProvider. Поэтому мне не нужна помощь по настройке.Ошибка проверки правильности модели MVC модели ASP.NET

Но когда дело доходит до HtmlHelpers, я изо всех сил пытаюсь понять контекст сообщения об ошибке. И говоря context, я имею в виду, о какой ошибке мы говорим. Какой атрибут вернул ошибку?

Что я могу получить, это Key для ошибки и текущего ErrorMessage, но программно, нет ничего, что, по крайней мере, я знаю, что свяжет эту ошибку, о которой мы говорим. Был ли атрибут Required или какой-то другой атрибут, я не могу найти, как их отличить.

Давайте немного откроем сценарий. У меня есть пользовательский HtmlHelpers для рендера ContentEditable элементов. Например, Html.ContentEditableValidationMessageFor(m => m.firstName);. Это будет что-то вроде этого:

<span contenteditable="true" data-valmsg-for="firstName" data-valmsg-replace="Please provide first name" class="field-validation-error">Please provide first name</span> 

Теперь у меня есть плагин JQuery для обработки и сохранения изменений в contenteditable элементе, и он будет сохраняться их в бэкэнд. Однако в пользовательском интерфейсе нет ничего, что могло бы сказать, какое сообщение об ошибке мы говорим. Люди могут легко увидеть, что это RequiredAttribute, но программно нет данных, чтобы отличить его от некоторого MinLengthAttribute.

В этом случае, если бы я просто использовал data-valmsg-for="firstName" в качестве ключа для локализации, это возвращало бы то же сообщение об ошибке для всех ошибок, относящихся к одному и тому же свойству.

Чтобы округлить

Что бы лучшая практика, когда ModelState доступен, испускать уникальный идентификатор для ModelError? Учитывая, что я использую ASP.NET MVC4 и DataAnnotationsModelValidatorProvider.

Я могу придумать множество способов «взломать его вместе», но я бы хотел использовать ModelState и все, что предоставляет MVC. Если все сходит до написания пользовательского ModelValidatorProvider, то я все открыт для него. Пока это лучший и самый устойчивый способ обойти это. Я все для делать больше Теперь и меньше Позже чем Взлом это сейчас и Взлом его навсегда, чтобы держать его работы

+0

Это очень интересный вопрос для меня. Какова была основа вашего взлома с использованием отражения? Как и вы, фраза «хорошо, что вы можете это сделать посредством рефлексии» часто означает настройку кода, который неизбежно будет плохо поддерживаться. Будете следить за этим ... –

+0

Вы хотите данные на стороне клиента или сервера? – Jared

+0

Любое обновление о вашем прогрессе? –

ответ

4

Можете ли вы дать некоторый контекст вокруг необходимости знать, какое правило вызвало ошибку проверки, может это быть примером того, как вы пытаетесь сделать что-то, чего вам тоже не нужно?

В целом я использую FluentValidation (http://fluentvalidation.codeplex.com/wikipage?title=mvc) вместо Data Annotation валидации по многим причинам, де-загромождения моделей, логики проверки единичного тестирования, что позволяет значительно более сложную проверку, включающую бизнес-логику. Если вы будете использовать библиотеки сторонних разработчиков, я бы посмотрел на них так, как будто они всегда решали любые проблемы с проверкой, которые у меня были в прошлом.

Это позволяет вам писать код C#, который относится к вашей проверке модели с помощью свободного API. У этого есть расширение MVC, которое прокладывает все для Вас так, кроме создания класса проверки моделей, от которого мало влияет. Пример вашего фрагмента кода выше ...

RuleFor(modelname => modelname.FirstName).NotEmpty().WithMessage("lease provide first name"); 
2

Даже реализации ModelValidatorProvider не поможет, это просто механизм для обеспечения ModelValidator сек на основе модели метаданных. Когда во время процесса связывания модели в контроллере вызывается действие ModelValidator, результат равен ModelValidationResult, который содержит только MemberName и текст Message.

Я думаю, что есть грязный способ выяснить, какие ModelValidator неудачны, проверив сообщение об ошибке, как это:

var modelErrors = ModelState.Where(m => m.Value.Errors.Count > 0).Select(m => new { Name=m.Key , Errors=m.Value.Errors}); 

путем проверки ErrorMessage ошибок для каждого ключа в modelErrors от сообщений об ошибках ValidatorProvider вы можете найти ошибка принадлежит тому, какой валидатор.

+1

Спасибо. Но я уже использую грязный способ отражения, чтобы проверить, что проверяемые свойства ValidationAttributes проверяются. Он ищет ErrorResourceKey атрибута, который выводит ту же ошибкуMessage, которая в настоящее время заполняется в ModelState. Таким образом, я могу конкатенировать имя свойства и ключ ресурса ошибки, чтобы получить уникальный ключ для ошибки свойства. –

Смежные вопросы