ASP.NET MVC Условная проверка - PullRequest
121 голосов
/ 10 марта 2010

Как использовать аннотации данных для условной проверки модели?

Например, допустим, у нас есть следующая модель (человек и старший):

public class Person
{
    [Required(ErrorMessage = "*")]
    public string Name
    {
        get;
        set;
    }

    public bool IsSenior
    {
        get;
        set;
    }

    public Senior Senior
    {
        get;
        set;
    }
}

public class Senior
{
    [Required(ErrorMessage = "*")]//this should be conditional validation, based on the "IsSenior" value
    public string Description
    {
        get;
        set;
    }
}

И следующий вид:

<%= Html.EditorFor(m => m.Name)%>
<%= Html.ValidationMessageFor(m => m.Name)%>

<%= Html.CheckBoxFor(m => m.IsSenior)%>
<%= Html.ValidationMessageFor(m => m.IsSenior)%>

<%= Html.CheckBoxFor(m => m.Senior.Description)%>
<%= Html.ValidationMessageFor(m => m.Senior.Description)%>

Я бы хотел быть условным обязательным полем свойства Senior.Description, основываясь на выборе свойства IsSenior (true -> обязательный) Как реализовать условную валидацию в ASP.NET MVC 2 с аннотациями данных?

Ответы [ 12 ]

0 голосов
/ 06 января 2017

Я использую MVC 5, но вы можете попробовать что-то вроде этого:

public DateTime JobStart { get; set; }

[AssertThat("StartDate >= JobStart", ErrorMessage = "Time Manager may not begin before job start date")]
[DisplayName("Start Date")]
[Required]
public DateTime? StartDate { get; set; }

В вашем случае вы бы сказали что-то вроде "IsSenior == true". Тогда вам просто нужно проверить правильность вашего действия после публикации.

0 голосов
/ 09 августа 2015

Типичное использование для условного удаления ошибки из состояния модели:

  1. Сделать условную первую часть действия контроллера
  2. Выполнение логики для удаления ошибки из ModelState
  3. Выполните оставшуюся часть существующей логики (обычно проверка состояния модели, затем все остальное)

Пример:

public ActionResult MyAction(MyViewModel vm)
{
    // perform conditional test
    // if true, then remove from ModelState (e.g. ModelState.Remove("MyKey")

    // Do typical model state validation, inside following if:
    //     if (!ModelState.IsValid)

    // Do rest of logic (e.g. fetching, saving

В вашем примере, оставьте все как есть и добавьте предложенную логику к действию вашего контроллера. Я предполагаю, что ваша ViewModel, переданная в действие контроллера, имеет объекты Person и Senior Person с данными, заполненными в них из пользовательского интерфейса.

...