MC, 20:01 sobota, 06.10.2012 r.
Ilustracja do artykułu: ASP.NET MVC - Metoda TryUpdateModel() i wprowadzanie zmian w modelu tuż przed jego aktualizacją

ASP.NET MVC - Metoda TryUpdateModel() i wprowadzanie zmian w modelu tuż przed jego aktualizacją

Jeśli się nie mylę, to już kiedyś wspominałem na łamach strony, że w mojej ocenie technologia ASP.NET MVC jest świetna pod warunkiem, że tworzona aplikacja jest stosunkowo prosta i trzyma się ogólnych założeń wzorca MVC i narzędzi do niego dostarczonych. Sytuacje odmienne, wymagają nieco więcej uwagi i odpowiednich zabiegów. Jednym z tego przykładów może być aspekt aktualizacji modelu przez metodę TryUpdateModel(), a raczej sytuacja w której chcielibyśmy na moment przed tą operacją w kontrolerze, nieco ten model zmienić.

W czym problem?

Technologia ASP.NET MVC dostarcza bardzo wygodnej metody pozwalającej aktualizować dane w modelu zebrane w kolekcji z widoku. Jest to oczywiście metoda TryUpdateModel(). Rozwiązanie to jest bardzo przyjemne, do póki nie chcemy wprowadzić pewnych modyfikacji do modelu, przed jego aktualizacją. Z doświadczenia wiem, że zwyczajne wprowadzenie zmian w kolekcji, a następnie wykonanie standardowego wywołania metody TryUpdateModel(), nie przynosi oczekiwanych rezultatów i jest nieczułe na nasze zmiany. Na szczęście jest na to sposób, z resztą również serwowany przez używaną technologię, bo nie chciałbym żeby ten artykuł miał wydźwięk krytyczny wobec niej, rzecz w tym, że trzeba o tym podejściu wiedzieć, bo na pierwszy rzut oka, ignorowanie zmian może wydawać się niekonsekwentne.

Jak wprowadzić zmiany tuż przed aktualizacją modelu?

Tak naprawdę, wszystko sprowadza się do wywołania odpowiedniego przeładowania metody TryUpdateModel(), a mianowicie takie, które w sposób jawny podaje źródło, z którego mają zostać pobrane nowe wartości dla własności modelu na którym opiera się dany widok. Poniższy kod, w sposób klarowny powinien ilustrować to co właśnie stwierdziłem:
collection["JakiesPole"] = HttpUtility.HtmlDecode(collection["JakiesPole"]); // dowolna operacja na kolekcji danych

if (TryUpdateModel(Model, collection)) // kolekcja (collection) jako źródło danych dla modelu (Model)
{
// ...
}

Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!

Imię:
Treść: