У меня есть такая модель:
public PurchaseOrder
{
[Required] [StringLength(15)]
public virtual string OrderNumber {get;set;}
// etc.
}
Когда я отправляю заказ из представления (используя $.post, а не input 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, с ошибкой: "Поле" Номер заказа "требуется". Но в этом поле есть значение (почему)
Почему бы ему сказать, что "значение требуется", когда оно имеет значение? Я что-то пропустил? Это из-за $.post вместо submit? Что я могу сделать?
Вот что выглядит отладчик:
alt text http://www.freeimagehosting.net/uploads/f734f3d95d.png
EDIT: дополнительная информация....
Я действительно думаю, что по какой-то причине привязка к модели не происходит. Когда я попробую этот код найти здесь:)
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 = true. compositeValidator.Validate() возвращает 0 ошибок. Я думаю, это означает, что модель не была связана, но я до сих пор не знаю почему.
Метод контроллера на самом деле выглядит следующим образом (я пропустил фильтр при первоначальном написании этого вопроса)
[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))]
public JsonResult Save(PurchaseOrder order) { // etc ... }
И JsonFilter делает это, чтобы извлечь POCO из предоставленных json данных:
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
Я положил точку останова на эту строку, и порядок действителен, плюс order.OrderNumber имеет правильное значение.
Так что все еще не разрешено, но, надеюсь, эта дополнительная информация поможет найти решение