2010-05-06 4 views
1

В принципе, что говорится в названии. У меня есть несколько свойств, которые объединяются, чтобы действительно сделать один логический ответ, и я хотел бы запустить код проверки на стороне сервера (который я пишу), который учитывает эти несколько полей и подключается к одному сообщению вывода/ошибки проверки, которое пользователи видят на веб-странице.Как выполнить пользовательскую проверку нескольких свойств в ASP.NET MVC 2.0?

Я рассмотрел способ расширения атрибута scott guthries и использования его в объявлениях данных yoru dataannotations, но, как я вижу, нет способа объявить атрибут атрибута dataannotations для нескольких свойств, и вы можете разместить только (например, [Email], [Range], [Required]) над одним свойством :(

любые идеи о том, как это сделать? желательно, не переходя весь путь AssociateValidatorProvider, поскольку я нашел это трудным для понимаете, потому что люди никогда не говорят вам, «почему» они делают то, что делают, достаточно подробно, чтобы я чувствовал себя комфортно.

В настоящий момент я попытался создать скрытый скрытый поле в форме с атрибутом [Обязательный] на нем, и я устанавливаю его в пустую строку, когда мой многопользовательский код пользовательской проверки предсказывает ошибку, которая shoudl вызывает сообщение об ошибке, но даже не работает, потому что когда я меняю значения этих полей ПОСЛЕ того, как действие получено, модельное состояние не обновляется с этой информацией, поэтому предполагает переданные значения, а сбой обновления UpdateModel с ошибкой. на вершине этих ошибок, я полагаю, что это не элегантный способ сделать что-то. поэтому я слушаю все, что вы, ребята, предлагаете.

ответ

2

Вы можете добавить эти сообщения проверки в ошибки ModelState и отобразить их на стороне клиента с помощью Jquery/JavaScript.

Если ваш метод действия возвращает JsonResult, тогда возвращайте ошибки, поскольку JsonResult еще установил ошибки в ViewData, а затем обратился к ним и отобразил их на стороне клиента.

Вы можете добавить пользовательские ошибки в состояние модели следующим образом:

if(your custom validation fails....) 
{ 
    ModelState.AddModelError("Error1", "Your Error message1"); 
    ModelState.AddModelError("Error2", "Your Error message2"); 
} 

if (!ModelState.IsValid) 
{ 
    return new JsonResult() { Data = GetModelStateErrors(ModelState)}; 
} 

private static Collection<string> GetModelStateErrors(ModelState modelState) 
    { 
     Collection<string> errors = new Collection<string>(); 

     foreach (var item in modelState.Values) 
     { 
      foreach (var item2 in item.Errors) 
      { 
       if (!string.IsNullOrEmpty(item2.ErrorMessage)) 
       { 
        errors.Add(item2.ErrorMessage); 

       } 
      } 
     } 
     return errors; 
    } 
+1

спасибо, я также изучал, как это сделать, напрямую разговаривая с коллекцией ошибок модели, чтобы обойти внутренние проблемы mvc. я продолжу это :). –

0

Вам необходимо создать атрибут уровня. В визуальной студии создайте новый проект MVC 2, а затем найдите PropertyMustMatchAttribute для простого примера того, как это сделать.

+0

я сделал это, но сейчас я понятия не имею, как есть моя ошибка отображается в моей странице ASPX. Я пытаюсь сделать html.ValidationMessage ("ClassNameWhereAttributeIsAdded"), но он не работает .... ошибка не отображается. –

+0

Поскольку ошибка связана с несколькими полями, на самом деле не имеет смысла отображать ошибку рядом с одним полем в частности. Используйте метод расширения Html.ValidationSummary(). – s1mm0t

+0

ive используется сводка валидации, так же, как они используются в примере паролейMustMatch, но она не отображается;/ –

2

Вы можете добавить атрибут проверки в классе:

http://msdn.microsoft.com/en-us/magazine/ee336030.aspx

Однако я не был в состоянии проверить это сам.

+0

Я сделал это, однако не смог получить сообщение проверки для отображения в представлении, даже когда я передал имя класса или пустую строку, как это было рекомендовано некоторыми. –