W ASP.MVC 3 dodano bardzo przyjemną walidację danych po stronie klienta, która nie miesza w htmlu jak Gargamel w wielkim garze pełnym wypatroszonych kwiczących smerfów. Wszystkie dane chowa w atrybutach ("data-*" zgodnych z HTML5), a skrypty wywalone są na zewnątrz. Tak jak powinno być. Zwie się bardzo poważnie: unobtrusive validation.
Wystarczy zawrzeć to co się chce w @using(Html.BeginForm()) { } i jazda.
Ale co gdy nie chcemy formy? Ja na przykład pobieram ajaxem wyrenderowany serwerze panel do dodawania nowego elementu, a następnie doklejam go do formy już istniejącej na stronie. Teoretycznie można w tym panelu i tak utworzyć formę a potem wygrzebywać z niej po stronie klienta zawartość, ale... czyż to nie lamerskie?
Okazało się, że wystarczy taki myk:
1: @{
2: var originalCtx = ViewContext.FormContext;
3: ViewContext.FormContext = new FormContext();
4: }
5:
6: @* content with validation *@
7:
8: @{
9: ViewContext.FormContext = originalCtx;
10: }
i już. Pięknie może ten kod nie wygląda, ale zdecydowanie robi co do niego należy. Można to ubrać w ładny helper implementujący IDisposable, ale póki co jeszcze tego nie robiłem ponieważ sytuacja taka zdarza się raczej sporadycznie.
Jak dla mnie jest to trick miesiąca.