2009-07-07 12 views
11

To doprowadzało mnie do szału.Modele MVC nie zostały zaktualizowane, ale nie można znaleźć powodu.

wciąż otrzymuję następujący wyjątek

System.InvalidOperationException: Model typu „Models.Expense” nie został pomyślnie zaktualizowany. w System.Web.Mvc.Controller.UpdateModel [TModel] (model TModel, przedrostek String, String [] includeProperties, String [] excludeProperties, IDictionary`2 valueProvider) w System.Web.Mvc.Controller.UpdateModel [TModel] (model tModel) atMVC.Controllers.BaseExpenseController.Edit (id String, kolekcja FormCollection) w C: \ Projects \ Expenses.MVC \ Sterowniki \ BaseExpenseController.cs: linia 109

Ale nie mogę wyśledzić, dlaczego to nie aktualizuje się, nic w tym wyjątku nie sugeruje, dlaczego nie zostało zaktualizowane.

Jakieś wskazówki?

+0

można pisać kod, trudno wyśledzić bez niego. – Lazarus

Odpowiedz

15

połowu wyjątek lub zadzwoń TryUpdateModel zamiast. TryUpdateModel nie wyrzuci wyjątku, jeśli nie będzie mógł zaktualizować modelu, po prostu zwróci false. Szczegóły błędu znajdziesz w ModelState zgodnie z sugestią Craiga. W rzeczywistości UpdateModel po prostu wywołuje TryUpdateModel i zgłasza, jeśli zwraca false.

+2

Jesteś magicznym człowiekiem. Dzięki. – SquidScareMe

+1

Nie jest tak mądrze ignorować błąd. Będzie Cię ścigał cały czas, dopóki cię nie dopadnie :) –

+0

Dla Milana, "najlepiej" radzić sobie z fałszem. Coś jak, jeśli (! TryUpdateModel (model)) zwraca widok ("Edycja", model). Zakładając, że sprawdziłeś poprawność w interfejsie użytkownika, pokaże on błędy. – Daniel

12

Zbadać controller.ModelState i poszukaj wpisów z błędami> 0.

2

Trudno powiedzieć na pewno, nie widząc żadnego kodu, ale za każdym razem, gdy widziałem wyjątek tego typu, 99% czasu jest związane z bazą danych. Nie znaczy to, że główna przyczyna nie jest gdzieś w kodzie, ale jest całkiem możliwe, że czegoś brakuje i próbujesz przekazać nieprawidłowe dane do bazy danych. Inne problemy, które należy rozważyć, to jakakolwiek obsługa relacji, która musi mieć miejsce.

0

Generalnie sprawdzam 3 rzeczy.

  1. Do każdego z modeli członków mają pobierające i ustawiające
  2. jestem spełniające wymagania modelu. tj: Czy wszystkie wymagane dane są obecne i poprawne?
  3. Czy naruszam gdzieś związek? Czy muszę mieć wartości domyślne dla zagnieżdżonych obiektów?

Jeśli to się nie uda, powracam do;

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

co zwykle działa.

0

W wygenerowanym formularzu internetowym sprawdź, czy masz ukryte pole, prawdopodobnie identyfikator jakiegoś rodzaju, którego nie można zaktualizować.

1

Miałem ten sam problem, a problem był przyczyną, dla której używam interfejsu IValidatableObject w modelu, który był w związku z tym, który zaktualizowałem. Prawdziwy problem był w bazie danych, ponieważ sprawdzanie poprawności powoduje, że mam zduplikowane wpisy dla unikalnej kolumny :)

Chodzi o to. Powinieneś użyć UpdateModel lub TryUpdateModel, obie metody aktualizują ModelState.IsValid. Czasami może być trudno znaleźć przyczynę błędu. Spójrz na debugger dla ModelState.ErrorKeys i sprawdzić, czy istnieje wejście, które nie powinno tam być :)

Cheers

Powiązane problemy