Проверка на стороне сервера MVC3, проверка правильности свойства в частичном классе

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

Единственное, у меня есть много этих дочерних моделей и редакторов на экране одновременно, и мне нужно, чтобы недопустимые редакторы выделялись немного больше, например, придав окружающему 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>

person Ben    schedule 17.03.2014    source источник


Ответы (1)


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

Html.ViewData.ModelState.IsValidField("Child_Id")

Он вернет, является ли данное поле допустимым или нет, я не уверен, как вы входите в коллекцию, я раньше не использовал его таким образом.

person Mark    schedule 17.03.2014
comment
Боюсь, то же самое, похоже, это зависит от достоверности всех экземпляров этого поля. например, если все Selected_Ids во всех ChildModels действительны, он возвращает true и false, если какой-либо из них недействителен. - person Ben; 18.03.2014
comment
Попробуйте добавить в модель поле, предназначенное исключительно для проверки этого конкретного объекта. Тогда у каждого объекта будет свое поле. Нет проблем с добавлением поля в вашу модель представления для этой цели, для чего предназначена модель представления. Должна быть возможность перебрать коллекцию и установить поле ошибки, когда возникает ошибка. - person Mark; 18.03.2014
comment
Если я правильно понимаю ваше предложение, то это именно то, что я сделал с момента публикации этого вопроса, но это похоже на уловки. Просто чтобы уточнить, мои модели были созданы инфраструктурой сущностей, поэтому я добавил проверку в разделяемый класс, а также теперь добавил свойство bool Is_Valid в ChildModel, для которого устанавливается значение false, когда проверка не удалась. Я действительно надеялся, что есть способ сделать это с помощью ModelState или чего-то подобного, поэтому я оставлю это открытым немного дольше. - person Ben; 18.03.2014
comment
Лично я бы посоветовал не использовать модель непосредственно из формы и полностью отделить вашу модель представления от вашей модели данных. Это менее гибко, а также дает вам мышление, которое у вас есть в настоящее время, т.е. Ограничение того, что вы помещаете в свою модель представления, используется только для отображения и управления представлением, а не ограничивает его использование из-за других ограничений. Отделите свою модель данных, затем используйте такой инструмент, как automapper, для сопоставления между моделью данных и моделью представления, это больше работы, но разделяет проблемы, в которых заключается весь смысл mvc. - person Mark; 18.03.2014