#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 (модель). Удалите [Обязательные] теги. Сузьте его до простейшей формы и посмотрите, сможете ли вы заставить его работать таким образом.