ASP.NET Веб-API ModelState не содержит всех параметров, проверка не работает

#c# #asp.net #asp.net-mvc #asp.net-web-api

#c# #asp.net #asp.net-mvc #asp.net-web-api

Вопрос:

Я использую ASP.NET Веб-API, и у меня есть этот метод POST в контроллере:

 [Route("Order/{siteId}/{orderId}")]
public HttpResponseMessage Post(long siteId, long orderId, OrderInformation orderInfo)
{
    if (ModelState.IsValid) { ... }
}
 

У меня есть пара аннотаций данных в классе OrderInformation (обязательно и т.д.), Но, к сожалению, проверка не работает. Это потому, что ModelState не содержит ключа для OrderInfo. Он содержит только SiteID и OrderID.

введите описание изображения здесь

Итак, мой вопрос в том, почему параметр OrderInfo не включен в ModelState. Я понятия не имею, почему это работает так странно, потому что я использую похожий код в разных местах, и он работает нормально.

Редактировать:

Вот модель (класс OrderInformation):

 public class tOrderInformation
{

    [Required]
    public string LoyaltyNumber;
    [Required]
    public string SpecialInstructions;
    public bool SendEmail;

    ...
    // few more string properties, no data annotations
}
 

Редактировать 2:

Я отправляю сложный тип в теле, сериализованный в JSON. Я также попробовал эту сигнатуру метода:

 [Route("Order/{siteId}/{orderId}")]
public HttpResponseMessage Post(long siteId, long orderId, [FromBody] OrderInformation orderInfo)
 

Комментарии:

1. Чтобы узнать, почему ваша модель не передается обратно в действие, нам нужно увидеть модель и, что более важно, представление, а не действие.

2. @Coda17 Я добавил класс модели. Это веб-API, поэтому нет представления

Ответ №1:

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

Ответ №2:

Вы не должны передавать сложный объект в URL. Получите orderinfo из тела запроса

 [Route("Order/{siteId}/{orderId}")]
public HttpResponseMessage Post(long siteId, long orderId, [FromBody]OrderInformation orderInfo)
{
    if (ModelState.IsValid) { ... }
}
 

И отправьте объект с помощью json. Таким образом, оно не должно быть нулевым.

Комментарии:

1. Спасибо за ответ. Я делаю это таким образом. Я отправляю данные JSON в теле запроса. Я также пробовал оба варианта с атрибутом FromBody и без него, но ни один из них не работает.

2. Хорошо, тогда это обычное дело. Если вы отправляете из тела, убедитесь, что вы сохраняете тег [FromBody] и в 95% случаев, когда он равен null, это синтаксис Json, поэтому проверьте, правильно ли вы отправляете объект. Поиграйте с объектом json. Совет: вы можете легко протестировать запрос с помощью этого бесплатного инструмента: chrome.google.com/webstore/detail/advanced-rest-client /…

3. Также постарайтесь максимально упростить dto (модель). Удалите [Обязательные] теги. Сузьте его до простейшей формы и посмотрите, сможете ли вы заставить его работать таким образом.