Validarea datelor din formularul postat în cadrul MVC ASP.NET

M-am jucat cu ASP.NET MVC Framework și singurul lucru care mă derută cu adevărat este modul în care trebuie să fac validarea pe partea de server a datelor de pe formularul afișat. Presupun ca nu post inapoi la aceeasi adresa URL, dar daca nu, cum sa reeditez formularul cu datele introduse si cu mesajele de eroare? De asemenea, unde ar trebui să meargă logica de validare? În model sau în controler? Aceasta pare să fie una dintre puținele domenii în care formele web sunt mult mai puternice (mi-e dor de controalele de validare).

0
fr hi bn

6 răspunsuri

Iată o prezentare generală a fluxului în MVC:

  1. /new - render your "New" view containing a form for the user to fill out
    • User fills out form and it is posted to /create
    • The post is routed to the Create action on your controller
    • In your action method, update the model with the data that was posted.
    • Your Model should validate itself.
    • Your Controller should read if the model is valid.
    • If the Model is valid, save it to your db. Redirect to /show to render the show View for your object.
    • If the Model is invalid, save the form values and error messages in the TempData, and redirect to the New action again. Fill your form fields with the data from TempData and show the error message(s).

Cadrele de validare vă vor ajuta în acest proces. De asemenea, cred că echipa ASV.NET MVC planifică un cadru de validare pentru următoarea previzualizare.

0
adăugat
Lance, este cupa TempData specifică acelei solicitări? Evident, aceasta ar crea probleme dacă ar fi fost bazată pe sesiune și mai multe solicitări au încercat să stocheze date în aceeași buchet. De asemenea, este folosirea lui TempData un hack? În acest fel, alte cadre MVC rezolvă problema?
adăugat autor Ben Mills, sursa
TryUpdateModel() va prelua datele formularului dvs. și va încerca să le pună în obiect. Utilizați doar FormData ca parametru pentru controlerul dvs., mai degrabă decât tipul de obiect. Cealaltă opțiune ar fi să construiți un liant model particular. Mai multe aici: hanselman.com/blog/…
adăugat autor Lance Fisher, sursa
Rezumat bun! Singura problemă cu care am identificat acest lucru este că vreau să pot valida tipul de date și nu pot face acest lucru înainte de a transmite datele de formular modelului, deoarece el va arunca excepții în timpul creării acestuia. Există o cale frumoasă în jurul acestui lucru?
adăugat autor bobwah, sursa
Rezumat excelent! Va fi minunat cu un exemplu
adăugat autor Cherian, sursa

Have you taken a look at this? http://www.codeplex.com/MvcValidatorToolkit

Citat din pagină

Setul de instrumente Validator oferă un set   de validatori pentru noul ASV.NET MVC   cadru pentru validarea formularelor HTML pe   clientul și serverul folosind   seturi de validare.

Mă tem că cineva mai înzestrat cu MVC decât mine ar trebui să vorbească unde să arunci în arhitectură lucrurile.

0
adăugat
Am analizat proiectul CodePlex, dar nu am fost impresionat de ceea ce am văzut (la acel moment). Poate că e mai bine acum. Voi lua o altă privire. Evident, Jeff și echipa trebuie să valideze datele formularului din StackOverflow. Când mă uit la codul HTML pentru pagina Întreabă o întrebare , se pare că pagina revine la ea însăși. Mă întreb cum pun în aplicare validarea.
adăugat autor Ben Mills, sursa

Învățăm de asemenea cadrele MVC, deci nu sunt sigur ce este, dar din câte am înțeles că veți avea un formular pe un Vizualizator, cum ar fi Edit.aspx. Acest formular va trimite apoi la controler o altă metodă de acțiune, cum ar fi Update (), care va transmite conținutul formularului pe care l-ați setat în Edit.aspx ca parametru.

Update(int id, string name, string foo)

Ai putea face validarea în cadrul acelei metode. Dacă totul este bine,

return View("Item", yourObject)
0
adăugat

There is Castle.Components.Validator module in Castle project. It's very agile and powerfull. It generates validation rules based on model attributes (or any other source) and even able to generate JS validation using jQuery, Prototype Validation, fValidate and other. Of course it's wise to abstract validator away behind IValidationEngine interface.

0
adăugat

S-ar putea să doriți să aruncați o privire la ultimul post al lui ScottGu pentru ASP.Net prev 5. Merge printr-un eșantion de validare care este foarte interesant:

În măsura în care pot să spun că toată lumea încă încearcă să-și dea seama de modul "standard" de a face acest lucru. Asta a spus cu siguranta sa verificati ultimele postari ale lui Phil Haack si Scott Guthrie pe MVC si veti gasi cateva informatii interesante despre cum au facut-o. Când tocmai jocam cu mine pentru mine, am creat un ModelBinder pentru clasa de date LinqToSql pe care o generasem. Puteți să verificați această postare pentru a afla cum să creați un ModelBinder de bază:

ASP.Net MVC Model Binder

În acțiunea dvs., dacă ați creat modelul "Produs", ați declara acțiunea exact așa:

public ActionResult Nou (produs)

Și liantul de model va avea grijă de atribuirea datelor postate la proprietățile obiectelor, atâta timp cât le-ați construit corect oricum.

După aceasta, în cadrul metodei GetValue (), puteți implementa validarea dorită, fie că utilizați excepții, fie regex-uri, fie că puteți face un apel precum:

(ModelStateDictionary_name) .AddModelError ("form_element_id", "entered_value", "error_message");

Then you can just throw a <%= Html.ValidationSummary() %> in your view to display all your errors.

Pentru validarea pe partea clientului am folosit doar jQuery. După ce obțineți un eșantion de bază înființat deși puteți începe să faceți niște lucruri interesante care să combine toate acestea cu vizionări parțiale și apeluri Ajax.

0
adăugat