2009-07-07 5 views
11

Cela m'a rendu fou.Les modèles MVC n'ont pas été mis à jour avec succès mais ne trouvent pas de raison.

Je continue à obtenir l'exception suivante

System.InvalidOperationException: Le modèle de type 'Models.Expense' n'a pas été mis à jour avec succès. à System.Web.Mvc.Controller.UpdateModel [TModel] (Modèle TModel, Préfixe de chaîne, Chaîne [] includeProperties, Chaîne [] excludeProperties, IDictionary`2 valueProvider) à System.Web.Mvc.Controller.UpdateModel [TModel] (modèle TModel) de atMVC.Controllers.BaseExpenseController.Edit (id String, collection FormCollection) dans C: \ Projects \ Expenses.MVC \ contrôleurs \ BaseExpenseController.cs: ligne 109

Mais je ne peux pas traquer pourquoi il ne met pas à jour, rien dans l'exception ne suggère pourquoi il n'a pas été mis à jour.

Des pointeurs?

+0

Pouvez-vous poster le code, il est difficile de traquer sans elle. – Lazarus

Répondre

15

Intercepter l'exception ou appelez TryUpdateModel à la place. TryUpdateModel ne lancera pas d'exception s'il ne peut pas mettre à jour votre modèle, il retournera simplement false. Vous trouverez les détails de l'erreur dans ModelState comme suggéré par Craig. En fait, UpdateModel appelle simplement TryUpdateModel et renvoie s'il renvoie false.

+2

Vous êtes un homme magique. Merci. – SquidScareMe

+1

Il n'est pas si malin d'ignorer une erreur. Il vous poursuivra tout le temps jusqu'à ce que vous obtenez :) –

+0

Pour le point de Milan, il est «préférable» de manipuler faux. Quelque chose comme si (! TryUpdateModel (model)) renvoie View ("Edit", model). En supposant que vous avez une validation câblée dans l'interface utilisateur, il affichera les erreurs. – Daniel

12

Examinez le controller.ModelState et recherchez les entrées avec des erreurs> 0.

2

Il est difficile de dire avec certitude sans voir de code, mais chaque fois que j'ai vu une exception de ce type, 99% du temps, il a été lié à la base de données. Pour ne pas dire la cause racine n'est pas quelque part dans le code, mais il est tout à fait possible que vous manquiez quelque chose et que vous essayiez de transmettre des données invalides à la base de données. D'autres questions à rechercher seraient tout traitement de relation qui doit avoir lieu.

0

Je vérifie généralement 3 choses.

  1. Est-ce que chacun des membres modèles ont accesseurs
  2. Suis-je satisfait aux exigences de du modèle. ie: Est-ce que toutes les données requises sont présentes et correctes? Est-ce que je viole une relation quelque part? Dois-je avoir des valeurs par défaut sur les objets imbriqués?

Si cela échoue toujours, je retourne à;

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

qui fonctionne habituellement.

0

Sur le formulaire Web généré, vérifiez si vous avez un champ caché, éventuellement un identifiant qui ne peut pas être mis à jour.

1

J'ai eu le même problème, et le problème était parce que j'utilise l'interface IValidatableObject dans le modèle qui était en relation avec celui que j'ai mis à jour. Le vrai problème était dans la base de données, puisque la validation donne que j'ai des entrées dupliquées pour la colonne unique :)

La chose est. Vous devez utiliser UpdateModel ou TryUpdateModel, les deux méthodes met à jour ModelState.IsValid. Maintenant, il peut parfois être difficile de trouver ce qui cause une erreur. Regardez le débogueur pour ModelState.ErrorKeys et vérifier s'il y a une entrée qui ne devrait pas être là :)

Vive

Questions connexes