2009-07-07 13 views
11

Esto me ha estado volviendo loco.MVC Modelos no actualizados correctamente pero no se puede encontrar el motivo

me siguen dando la siguiente excepción

System.InvalidOperationException: El modelo del tipo 'Models.Expense' no se ha actualizado correctamente. en System.Web.Mvc.Controller.UpdateModel [TModel] (modelo TModel, prefijo de cadena, String [] includeProperties, String [] excludeProperties, IDictionary`2 valueProvider) en System.Web.Mvc.Controller.UpdateModel [TModel] (modelo TModel) atMVC.Controllers.BaseExpenseController.Edit (String id, colección FormCollection) en C: \ Projects \ Expenses.MVC \ Controladores \ BaseExpenseController.cs: línea 109

Pero no puedo descubrir el motivo por lo no se actualiza, nada en la excepción sugiere por qué no se ha actualizado.

¿Alguna sugerencia?

+0

Se puede publicar el código, que es difícil de localizar sin ella. – Lazarus

Respuesta

15

captura la excepción o llame TryUpdateModel lugar. TryUpdateModel no lanzará una excepción si no puede actualizar su modelo, simplemente devolverá falso. Encontrará los detalles del error en el ModelState según lo sugerido por Craig. De hecho, UpdateModel solo llama a TryUpdateModel y lanza si devuelve falso.

+2

Eres un hombre mágico. Gracias. – SquidScareMe

+1

No es tan inteligente ignorar el error. Te perseguirá todo el tiempo hasta que te llegue :) –

+0

Para el punto de Milán, es "mejor" manejar falsa. Algo así como si (! TryUpdateModel (modelo)) devuelve View ("Editar", modelo). Suponiendo que tiene la validación conectada en la interfaz de usuario, mostrará los errores. – Daniel

12

Examine el controller.ModelState y buscar las entradas de errores> 0.

2

Es difícil decirlo con seguridad sin ver ningún código, pero cada vez que he visto una excepción de ese tipo, el 99% del tiempo ha estado relacionado con la base de datos. No quiere decir que la causa raíz no está en algún lugar del código, pero es bastante posible que te falte algo e intentes pasar datos no válidos a la base de datos. Otros problemas a tener en cuenta serían cualquier manejo de relación que deba tener lugar.

0

En general, compruebo 3 cosas.

  1. hacer cada uno de los miembros modelos tienen captadores y definidores
  2. ¿Estoy cumpliendo con los requisitos de el modelo. es decir: ¿Se requieren todos los datos y son correctos?
  3. ¿Estoy violando una relación en alguna parte? ¿Debo tener valores predeterminados en objetos anidados?

Si eso falla, entonces vuelvo a;

class MyClass(FormCollection collection) 
{ 
    string a = collection["MyField"]; 

que generalmente funciona.

0

En el formulario web generado, compruebe si tiene un campo oculto, posiblemente una ID de algún tipo que no se puede actualizar.

1

Tuve el mismo problema, y ​​el problema fue porque estoy usando la interfaz IValidatableObject en el modelo que estaba relacionado con uno que actualicé. El problema real estaba en la base de datos, ya que la validación produce que tengo entradas duplicadas para la columna única :)

El asunto es. Debe usar UpdateModel o TryUpdateModel, ambos métodos actualizan ModelState.IsValid. Ahora, a veces puede ser difícil encontrar lo que está causando un error. Mira el depurador de ModelState.ErrorKeys y comprobar si hay una entrada que no debería estar ahí :)

Saludos

Cuestiones relacionadas