Проверка модели не удалась в пустом списке - PullRequest
0 голосов
/ 06 мая 2019

Я передаю строковое представление объекта, который представляет список контроллеру C #, используя Ajax.Все работает хорошо, когда список заполнен, но когда он пуст, проверка модели не удалась.Строка, которую я передаю: {"RoutingTags":[]"}.

Класс, используемый для проверки модели, таков:

public class RoutingTagsData
{
    [Required]
    public IList<RoutingTag> RoutingTags { get; set; }
}

Список передается контроллеру с помощью Ajax, и контроллер выглядит следующим образом:

[HttpPost]
public HttpResponseMessage CreateOrUpdateRoutingTags(RoutingTagsData routingTagsData)
{
    if (!ModelState.IsValid)
        return new HttpResponseMessage(HttpStatusCode.BadRequest);

    // stuff
}

Однако проверка модели не удалась, поскольку routingTagsData имеет значение null.

Что я могу сделать, чтобы routingTagsData был объектом с пустым списком, без его созданиясам, если в контроллере он нулевой?

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Как сказал @Джон, вы можете инициализировать список, чтобы решить вашу проблему. И вы не делаете это внутри вашего контроллера.

public class RoutingTagsData
{
    [Required]
    public IList<RoutingTag> RoutingTags { get; set; } = new List<RoutingData>( ) ;
}

Но если вы уверены, что привязка выполнена правильно, и вы хотите использовать нулевое значение, но проверка не пройдена. Просто очистите ошибки Modelstate и продолжайте свою логику или просто создайте ModelBinder для ваших RoutingTagsData, и вы можете решить, что делать там (включать ошибки в ModelState или нет в случае, если список пуст), вы также можете инициализировать список там после того, как mvc делает вызов ModelBinder, но я бы не рекомендовал это делать.

Надеюсь, это поможет

1 голос
/ 06 мая 2019

без создания его экземпляра самостоятельно, если он равен null в контроллере?

Если список null является неожиданным - и я бы определенно утверждал, что все типы коллекций никогда не должны быть null - тогда реальная проблема заключается в том, что вы допускаете инициализацию RoutingTagsData в плохом состоянии для начала.

Инициализация по умолчанию должна обрабатываться конструктором по умолчанию класса:

public class RoutingTagsData
{
    public RoutingTagsData()
    {
        RoutingTags = new List<RoutingTag>();
    }

    [Required]
    public IList<RoutingTag> RoutingTags { get; set; }
}

которая решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...