2013-05-29 8 views
6

Coś naprawdę dziwnego dzieje się w mojej aplikacji MVC, która doprowadza mnie do szału. Na mojej stronie MVC, po wybraniu użytkownika, jego Login powinien zostać "wyrenderowany" dwukrotnie w kodzie HTML. Raz w formieSzalona nieruchomość MVC traci swoją wartość. Czy Html.HiddenFor błędu?

FrmNextStep('<Login>', ... 
(where Model.SelectedUser.Login is used) 

a raz w formie

<input id="SelectedLogin" name="SelectedLogin" value="<Login>" type="hidden"> 
(where "Model".SelectedLogin is used) 

ale drugi zawsze pozostać puste. To naprawdę dziwne, ponieważ pomimo tego, że dwa połączenia nie są dokładnie takie same, zwracana powinna być wartość.

I kiedy mam debugowanie kodu, jedyne połączenie z Wybranym Zaloguj się podczas fazy "renderowania" i zwróć poprawny login.

Czy jest jakiś błąd z Html.HiddenFor?

+1

Szalona nieruchomość ... –

Odpowiedz

11

Ok, to w rzeczywistości błąd/wadliwe zachowanie Html.HiddenFor.
Idea tej możliwości przyszła mi do głowy tylko wtedy, gdy pisałem moje pytanie.


zmieniłem go na:

<input type="hidden" value="@Html.AttributeEncode(Model.SelectedLogin)" id="SelectedLogin" name="SelectedLogin" /> 

i wszystko działa perfekcyjnie.

EDYTOWANIE:

Istnieje kolejne obejście.

Zadzwoń do ModelState.Clear(); w akcji postera kontrolera.
Użyję tej opcji.

ModelState.Clear(); 

+

@Html.HiddenFor(m => m.SelectedLogin) 
+2

Dlaczego upadek? Pokaż się, hater ^^ – Serge

+5

Nie downvoter, ale powodem może być to, że nie jest to "błąd/wadliwe zachowanie Html.HiddenFor". Jeśli używasz 'ModelState.Clear()', wydaje się prawdopodobne (nie można powiedzieć z twojego kodu), że istnieje własność 'SelectedLogin' w twoim' ModelState' (np. Wartość POSTed do akcji kontrolera), która różni się od wartość w twoim modelu. Pomocnicy HTML zawsze wybierają 'ModelState' zamiast' Model' podczas wybierania wartości. Jest to zgodne z projektem, a nie z błędem. – JimmiTh

0

miałem ten problem również z .cshtml wykonywania dwukrotnie wracając stronę, a drugi bieg problemy z NULL modelowych obiektów.

Użycie @Serge 's answer naprawia HiddenFor, ale wtedy miałem również problemy z częściami, których nie można rozwiązać w ten sposób.

Okazuje się być przerywany problem, gdzie metoda Controller które wywołuje widok jest ustawienie ViewBag właściwości wraz z powrotem widoku modelu + oddzielnie poprzez protected internal ViewResult View(string viewName, object model);.

Projekt, nad którym pracuję, ma to miejsce wszędzie, a na innych kontrolerach/widokach działa dobrze. Ale dla tej, którą utrzymywałem, ten problem z pustym miejscem w HiddenFor miał miejsce.

W każdym razie, wyciągnąłem wszystkie settery ViewBag ze sterownika i przeniosłem je do właściwości NotMapped na obiekcie modelu.

Po wykonaniu tej czynności połączenia HiddenFor itd. Zaczęły się znowu zachowywać. Więc nie mieszaj dzieci w ViewBag i ViewModel.

Powiązane problemy