Modele są wypełniane w ctor. Kiedy klikam Edytuj, aby edytować element, wszystko działa i wyraźnie widzę, że Model został zaktualizowany w modelach po wywołaniu TryUpdateModel().

Jednak po przekierowaniu do indeksu Models nie ma już moich zmian. Co się stało?

        // GET: /Contact/    
        public ActionResult Index()
        {
            return View(Models);
        }


        // GET: /Contact/Edit/5    
        public ActionResult Edit(int id)
        {
            var contactModel = Models.Find((x) => x.ID == id);
            return View(contactModel);
        }

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            var contactModel = Models.Find((x) => x.ID == id);
            if (TryUpdateModel(contactModel))
            {
               return RedirectToAction("Index");   
            }

            return View(contactModel);

        }
0
Houman 25 luty 2012, 00:26

3 odpowiedzi

Najlepsza odpowiedź

Uważam, że zmieniłeś tylko model w pamięci z wywołania edycji, ale nie zapisałeś zmian w pamięci trwałej (bazie danych), więc twój ctor ponownie ładuje go ze stanu niezapisanego.

0
Erik Philips 25 luty 2012, 00:32

Zależy to od tego, czego używasz do utrwalania modeli (zapisywania ich w bazie danych). W moim przypadku napotkałem ten sam problem i musiałem się upewnić, że wywołałem coś wzdłuż metody Update lub Save przed moim przekierowaniem, ponieważ moja sesja modelu była ograniczona do żądania HTTP, przekierowania nie spowodowało opróżnienia mojej sesji i zapisania zmian.

W moim przypadku używałem nHibernate i skończyło się na dodaniu atrybutu do tego, że po zakończeniu akcji opróżniłem moje zmiany.

0
Nick Albrecht 25 luty 2012, 00:34

Pomocnicy HTML domyślnie używają ModelState w poście. Zakłada, że ​​jeśli nie było przekierowania, musiał wystąpić błąd, więc pokaż „stare” wartości.

Musisz wyczyścić stan modelu (ModelState.Clear()) lub wymyślić inny wzorzec : )

0
Adam Tuliper - MSFT 25 luty 2012, 00:52