Я закончил добавив метод проверки для класса модели, который добавляет ошибки в 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
Вы прочитали это? http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx Вы можете запустить проверку и затем заполнить ModelState значениями. – LukLed
Это именно то, что я искал, @LukLed, спасибо ... попробовал это сейчас. – JeffSahol
Я пробовал это, @LukLed, но не мог заставить проверки проходить последовательно. Пока они были основаны на законченных атрибутах DataAnnotation, они загоряли бы, но пользовательские, которые мы добавили, не ... не представляли, почему, и я принял другой подход, см. Ниже. – JeffSahol