2012-06-07 9 views
2

У нас есть возможность того, что данные, загруженные из операции GET, могут быть недопустимыми для публикации и хотели бы иметь возможность отображать сообщения проверки при первой загрузке данных. Все проверки выполняются на стороне сервера с использованием ValidationAttributes.Показать сообщения проверки на GET

Как я могу заставить сводку валидации отображать при первой загрузке данных? Я предполагаю, что мне нужно каким-то образом вносить ошибки в ModelState, но сначала мне нужно вывести их из класса модели.

+1

Вы прочитали это? http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx Вы можете запустить проверку и затем заполнить ModelState значениями. – LukLed

+0

Это именно то, что я искал, @LukLed, спасибо ... попробовал это сейчас. – JeffSahol

+0

Я пробовал это, @LukLed, но не мог заставить проверки проходить последовательно. Пока они были основаны на законченных атрибутах DataAnnotation, они загоряли бы, но пользовательские, которые мы добавили, не ... не представляли, почему, и я принял другой подход, см. Ниже. – JeffSahol

ответ

0

Я не знаю, если понять, что вам нужно, но вот это ...

проверки запуска, чтобы показать сводку проверки при загрузке формы, используя Jquery

$(document).ready(function() { 
    $('#FormId').valid(); 
}); 
1

Я закончил добавив метод проверки для класса модели, который добавляет ошибки в ModelState. Затем я создал и добавил пользовательский ModelValidator и AssociatedValidatorProvider для вызова его во время обычной проверки, которая имеет место во время связывания формы. Таким образом, действия контроллера, которые не привязаны к классу модели напрямую, могут по-прежнему иметь вызов метода модели .Validate (ModelState) для подделки проверки. Этот подход хорошо подходит для проверки только на стороне сервера.

UserInfo Модель класса:

private IEnumerable<RuleViolation> GetRuleViolations() 
{ 
    List<RuleViolation> violationList = new List<RuleViolation>(); 

    if (String.IsNullOrWhiteSpace(FirstName)) 
     violationList.Add(new RuleViolation("First Name is required.", FirstName")); 

    return violationList; 
} 

public void Validate(System.Web.Mvc.ModelStateDictionary ModelState) 
{ 
    foreach (RuleViolation violation in GetRuleViolations()) 
    { 
     ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage); 
    } 
} 

Это, как он может быть использован непосредственно от действия в контроллера. В этом действии объект класса Model возвращается как часть модели UserSearch.

public ActionResult Search(UserSearch model) 
{ 
    if (this.ModelState.IsValid) 
    { 
     model.Search(); 
     if (model.UserInfo != null) 
     { 
      model.UserInfo.Validate(ModelState); 
     } 
    }... 

Это все, что я должен был сделать для конкретного случая использования, над которым я работал. Но я пошел вперед и завершил работу над «нормальной» проверкой на обратной передаче: создал простой ModelValidator с переопределением Validate, похожим на это. Если вы следуете приведенному выше шаблону во всех своих классах моделей, вы, вероятно, можете снова использовать их для них.

public override IEnumerable<ModelValidationResult> Validate(object container) 
{ 
    var results = new List<ModelValidationResult>(); 
    if (Metadata.Model != null) 
    { 
     UserInfoViewModel uinfo = Metadata.Model as UserInfoViewModel; 
     foreach (var violation in uinfo.GetRuleViolations()) 
     { 
      results.Add(new ModelValidationResult 
       { 
        MemberName = violation.PropertyName, 
        Message = violation.ErrorMessage 
       }); 
     } 
    } 
    return results; 
} 

Наконец, продлить AssociatedValidationProvider вернуть эту ModelValidator и добавить его в коллекцию ModelValidationProviders в Application_Start. Есть запись об этом на http://dotnetslackers.com/articles/aspnet/Customizing-ASP-NET-MVC-2-Metadata-and-Validation.aspx#s2-validation

+0

Хорошо, что вы это решили. Некоторые примеры кода были бы хороши. – LukLed

+0

Okey doke, @ LukLed..code добавлен – JeffSahol

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