Gram w środowisku ASP.NET MVC Framework. Jedną rzeczą, która naprawdę mnie myli, jest sposób sprawdzania poprawności opublikowanych danych formularza po stronie serwera. . Przypuszczam, że nie wysyłam z powrotem do tego samego adresu URL, ale jeśli nie, jak ponownie wyświetlić formularz z wprowadzonymi danymi i komunikatami o błędach? Ponadto, gdzie powinna iść logika walidacji? W modelu lub kontrolera? Wydaje się, że jest to jeden z niewielu obszarów, w których formularze sieciowe są znacznie silniejsze (brakuje mi kontroli walidacji).Sprawdzanie poprawności opublikowanych danych formularzy w środowisku ASP.NET MVC
Odpowiedz
Czasami warto spojrzeć na ostatni post ScottGu za ASP.Net poprz 5. spacery po próbie walidacji, który jest bardzo interesujący:
Czy spojrzałeś na to? http://www.codeplex.com/MvcValidatorToolkit
Cytat ze strony
walidatora Toolkit oferuje zestaw walidatorów dla nowych ram ASP.NET MVC do walidacji formularzy HTML na klient i po stronie serwera z wykorzystaniem zestawy walidacji .
Obawiam się, że ktoś bardziej doświadczony MVC niż ja musiałby porozmawiać z tym, gdzie w architekturze należy umieścić rzeczy.
Po prostu uczę się szkieletu MVC, więc nie jestem pewien, jak daleko to jest, ale z tego co rozumiem, masz formularz w widoku takim jak Edit.aspx. Ten formularz wysłałby następnie do kontrolera inną metodę działania, taką jak Update(), przekazującą zawartość formularza ustawionego w Edit.aspx jako parametry.
Update(int id, string name, string foo)
Możesz dokonać walidacji w ramach tej metody. Jeśli wszystko jest w porządku,
return View("Item", yourObject)
Oto przegląd przepływu w MVC:
- /nowy - renderować „Nowy” widok zawierający formularz, aby użytkownik mógł wypełnić
- Użytkownik wypełnia formularz i publikuje go/tworzy
- Post jest kierowany do akcji Utwórz na kontrolerze
- W swojej metodzie akcji zaktualizuj model za pomocą dane, które zostały opublikowane.
- Twój model powinien się zatwierdzić.
- Twój kontroler powinien przeczytać, czy model jest ważny.
- Jeśli model jest prawidłowy, zapisz go w bazie danych. Przekieruj do/pokaż, aby wyrenderować przedstawienie Zobacz dla twojego obiektu.
- Jeśli model jest nieprawidłowy, zapisz wartości formularza i komunikaty o błędach w pliku TempData i ponownie przekieruj do akcji Nowa. Wypełnij pola formularza danymi z TempData i wyświetl komunikat (y) o błędzie.
Ramy walidacji pomoże Ci wzdłuż w tym procesie. Ponadto myślę, że zespół ASP.NET MVC planuje ramy sprawdzania poprawności dla następnego podglądu.
Doskonałe podsumowanie! Będzie świetnie z przykładem – Cherian
Dobre podsumowanie! Jedynym problemem, jaki znalazłem, jest to, że chcę mieć możliwość sprawdzenia poprawności typu danych i nie mogę tego zrobić przed przekazaniem danych formularza do modelu, ponieważ będzie on zgłaszał wyjątki podczas jego tworzenia. Czy jest to dobry sposób? – bobwah
TryUpdateModel() pobierze dane twojego formularza i spróbuje umieścić je w twoim obiekcie. Wystarczy użyć FormData jako parametru dla kontrolera, a nie typu obiektu. Inną opcją byłoby zbudowanie niestandardowego spoiwa modelu. Więcej tutaj: http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx –
Istnieje moduł Castle.Components.Validator w projekcie Castle. Jest bardzo zwinny i potężny. Generuje reguły sprawdzania poprawności na podstawie atrybutów modelu (lub dowolnego innego źródła), a nawet może generować walidację JS przy użyciu jQuery, Prototype Validation, fValidate i innych. Oczywiście mądry jest abstrakcyjny weryfikator poza interfejsem IValidationEngine.
O ile mogę powiedzieć, każdy jest wciąż próbując zrozumieć "standardowy" sposób robienia tego. To powiedziawszy zdecydowanie sprawdź najnowsze posty Phila Haacka i Scotta Guthriego na temat MVC, a znajdziesz tam kilka interesujących informacji o tym, jak oni to zrobili. Kiedy po prostu bawiłem się z tym dla siebie, stworzyłem modelBinder dla klasy danych LinqToSql, którą wygenerowałem. Możesz sprawdzić ten artykuł, aby dowiedzieć się, jak umieścić razem podstawowe ModelBinder:
w swoim działaniu, jeśli stworzył „produkt” ModelBinder byłoby po prostu uznanie skargi tak:
public ActionResult Nowy (produkt prod)
I segregator modelu zajmie się przypisaniem zaksięgowanych danych do właściwości obiektów, o ile i tak go zbudowałeś.
Potem w swoim getValue() metoda można realizować niezależnie od poprawności chcesz, czy przy użyciu wyjątek'S, regex, albo cokolwiek można wykonać połączenie takich jak:
(ModelStateDictionary_name) .AddModelError ("form_element_id", " specified_value "," error_message ");
Następnie można po prostu wrzucić widok <% = Html.ValidationSummary()%>, aby wyświetlić wszystkie błędy.
Do sprawdzania poprawności po stronie klienta użyłem jQuery. Po uzyskaniu podstawowej próbki możesz zacząć robić ciekawe rzeczy, łącząc to wszystko z widokami częściowymi i Ajax.
Rzuciłem okiem na projekt CodePlex, ale nie byłem pod wrażeniem tego, co widziałem (w tym czasie). Może teraz jest lepiej. Przyjrzę się jeszcze raz. Oczywiście Jeff i zespół muszą walidować dane formularzy w StackOverflow. Kiedy patrzę na kod HTML strony [Zadaj pytanie] (http://stackoverflow.com/questions/ask), wygląda na to, że strona odsyła do siebie. Zastanawiam się, w jaki sposób wdrażają walidację. –