У меня есть модель, у которой в качестве одного из свойств есть список дочерних моделей. На мой взгляд, каждая дочерняя модель проверяется отдельно с использованием пользовательской проверки на стороне клиента. Все проверяется правильно, и отображаются правильные сообщения проверки.
Единственное, у меня есть много этих дочерних моделей и редакторов на экране одновременно, и мне нужно, чтобы недопустимые редакторы выделялись немного больше, например, придав окружающему div красный контур (а не только ввод как по умолчанию).
Поэтому мне нужно определить достоверность дочерних моделей в их частичных представлениях и добавить соответствующий класс CSS в div. Я читал в нескольких местах, что это можно сделать с помощью Html.ViewData.ModelState.IsValid
, но, похоже, это зависит от того, действительны ли ParentModel и ВСЕ ChildModels или нет.
Вот пример моей ParentModel, ChildModel, View для родителя и частичного представления для ChildModels:
public class ChildModel
{
public Guid Child_Id { get; set; }
public List<Guid> Selected_Ids { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
List<ValidationResult> Errors = new List<ValidationResult>();
if (this.Selected_Ids == null || !this.Selected_Ids.Any())
{
Errors.Add(new ValidationResult("You must select at least one id.", new List<string> { "Selected_Ids" }));
}
return Errors;
}
}
public class ParentModel
{
public Guid Parent_Id { get; set; }
public List<ChildModel> Children { get; set; }
public List<Guid> Available_Ids { get; set; }
}
@* View *@
@model ParentModel
<div>
@using(Html.BeginForm())
{
@Html.HiddenFor(m => m.Parent_Id)
@Html.EditorFor(m => m.Children, new { Model.Available_Ids })
<button type="submit">Save</button>
}
</div>
@* Partial View / Editor Template *@
@model ChildModel
@ {
List<Guid> Available_Ids = (List<Guid>)ViewData["Available_Ids"];
}
<div class='child_model @(Html.ViewData.ModelState.IsValid ? string.Empty : "Invalid")'>
@Html.HiddenFor(m => m.Child_Id)
@foreach(Guid Available_Id in Available_Ids)
{
@Html.CheckBoxFor(m => m.Selected_Ids, Available_Id.ToString())
}
</div>