У меня есть модель как это:
public PurchaseOrder
{
[Required] [StringLength(15)]
public virtual string OrderNumber {get;set;}
// etc.
}
Когда я размещаю заказ от представления (использующий $ .post, не вводит type=submit), это переходит к моему классу контроллера:
public class PurchaseOrderController
{
public JsonResult Save(PurchaseOrder order)
{
// TryUpdateModel(order); // commented out since modelstate.isvalid remains false anyway
if (ModelState.IsValid)
{
// its never valid
}
}
}
ModelState. IsValid всегда возвращает false с ошибкой: "Поле Order Number требуется". Но существует значение в этом поле (?? почему)
Почему это сказало бы, что "значение требуется", когда это действительно имеет значение? Я пропустил что-то? Это из-за $ .post вместо отправления? Что я могу сделать?
Это - то, на что похож отладчик:
сопроводительный текст http://www.freeimagehosting.net/uploads/f734f3d95d.png
Править: Дополнительная информация....
Я действительно думаю, что по некоторым причинам образцовой привязки не происходит. Когда я пробую этот код, найденный здесь:)
if (!ModelState.IsValid)
{
ModelState.Clear();
ModelMetadata modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => order, order.GetType());
ModelValidator compositeValidator = ModelValidator.GetModelValidator(modelMetadata, base.ControllerContext);
foreach (ModelValidationResult result in compositeValidator.Validate(null))
{
this.ModelState.AddModelError(result.MemberName, result.Message);
}
}
Затем ModelState. IsValid = верный. compositeValidator. Проверьте (), возвращает 0 ошибок. Я думаю, что это указывает, что модель не была связана, но я все еще не знаю почему.
Метод контроллера на самом деле похож на это (я пропустил фильтр, первоначально пишущий этот вопрос),
[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))]
public JsonResult Save(PurchaseOrder order) { // etc ... }
И JsonFilter делает это для извлечения ПОСТЕПЕННО из json отправило данные:
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
Я поместил точку останова на эту строку, и порядок допустим плюс порядок. OrderNumber имеет правильное значение.
Так все еще неразрешенный, но надо надеяться эта дополнительная информация поможет с нахождением решения
Ну, я «решил» это, но я не совсем понимаю, почему внесенные мной изменения помогли.
Мне пришлось сделать три вещи:
Удалить фильтр json (фильтры не привязываются)
Измените contentType на application / json
$. AjaxSetup ({ contentType: "application / json; charset = utf-8" });
Используйте фьючерсы MVC для загрузки Microsoft.Mvc.dll, как описано здесь: http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net -mvc-действие-метод-аргумент.aspx . Где сказано, чтобы добавить это в Application_Start () в Global.asax.cs:
ValueProviderFactories.Factories.Add (new JsonValueProviderFactory ());
Теперь я не знаю точно, почему это сработало, но оно сработало.
К сожалению, это имело отрицательный побочный эффект: тип содержимого применяется ко всем $ .get () и $.post () и сломали все мои jqgrids - они, кажется, работают, только если тип содержимого является значением по умолчанию application / x-www-form-urlencoded
Итак, я задал 2 следующих вопроса:
Is можно ли установить тип контента в вызове $ .post ()? Тогда мне не нужно было бы устанавливать его глобально Jquery - Как заставить $ .post () использовать contentType = application / json?
Можно ли заставить работать jqrid, если тип содержимого - application / json? JQuery - Как заставить $ .post () использовать contentType = application / json?
Вы уверены, что ошибка исходит из поля OrderNumber?
Кажется странным, что В сообщении об ошибке указан номер заказа в 2 слова.
Попробуйте изменить имя поля или удалить обязательный тег, чтобы убедиться, что именно здесь возникла ошибка.
Есть вероятность, что ваше сообщение jQuery отправляется неправильно обратно в контроллер. Возможно, вы публикуете только номер заказа, а не объект, который точно представляет модель. Мне нужно увидеть ваш javascript, чтобы быть абсолютно уверенным.
Правильный способ публикации в этом методе: (при условии, что номер вашего заказа хранится в переменной javascript с именем "orderNumber":
$.post([url to method],
{ order: { OrderNumber: orderNumber } },
function(json) {
//Insert code for actions to take after AJAX post returns.
},
'json');
Если это так, то следующий шаг, который я предприму, - это перепроверить что javascript действительно фиксирует значение номера вашего заказа и публикует его как часть запроса. Быстрое изучение с помощью Firebug должно помочь вам определить, происходит это или нет.