Tengo un modelo como este:ASPNET MVC: ¿Por qué ModelState.IsValid es falso "El campo x es obligatorio" cuando ese campo tiene un valor?
public PurchaseOrder
{
[Required] [StringLength(15)]
public virtual string OrderNumber {get;set;}
// etc.
}
Cuando envío una orden de la vista (usando $ .post, no input type = submit) que va a mi clase controlador:
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 siempre devuelve falso, con el error: "Se requiere el campo Número de orden". Pero hay un valor en este campo (¿por qué?)
¿Por qué debería decir "se requiere valor" cuando tiene un valor? ¿Me he perdido algo? ¿Es por el $ .post en lugar del submit? ¿Que puedo hacer?
Esto es lo que se ve como el depurador:
alt text http://www.freeimagehosting.net/uploads/f734f3d95d.png
EDIT: Información adicional ....
Realmente creo que por alguna razón el modelo de unión que no está ocurriendo. Cuando intento este código encontrado aquí:)
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);
}
}
Then ModelState.IsValid = true. compositeValidator.Validate() devuelve 0 errores. Creo que esto indica que el modelo no estaba vinculado, pero aún no sé por qué.
El método controlador en realidad se parece a esto (me perdí el filtro cuando se escribe originalmente esta pregunta)
[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))]
public JsonResult Save(PurchaseOrder order) { // etc ... }
Y el JsonFilter hace esto para extraer la POCO desde el JSON datos presentados:
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
Puse un punto de interrupción en esta línea, y el orden es válido, más el orden. OrderNumber tiene el valor correcto.
Así que todavía no resuelto, pero es de esperar que esta información adicional le ayudará a encontrar una solución
¿por qué la propiedad se marca como virtual? ¿Estás usando el seguimiento de cambios POCO? –
¿Cuál es el valor? ¿Cómo estás usando '$ .post'? ¿Funciona con envío normal? –
No sé por qué es virtual, fue así cuando comencé a trabajar en la aplicación existente. –