Cum funcționează metoda ASP.NET MVC UpdateModel()? (Programare, Asp.Net Mvc)

Kirschstein a intrebat.

Lucrez la prima mea aplicație .NET MVC și folosesc tutorialul NerdDinner ca punct de referință. Un punct care mă intrigă în acest moment este metoda UpdateModel() metoda. (Nu-mi place să folosesc lucruri pe care nu le înțeleg cu adevărat).

Preluat din tutorialul NerdDinner

//
// POST: /Dinners/Edit/2

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues) {

    Dinner dinner = dinnerRepository.GetDinner(id);

    UpdateModel(dinner);

    dinnerRepository.Save();

    return RedirectToAction("Details", new { id = dinner.DinnerID });
}

Întrebarea mea principală este cum funcționează metoda UpdateModel() obține acces la formValues trecut în metoda Edit? De ce colecția nu este trecută explicit ca parametru al metodei?

Comentarii

  • Aș obține Sursa ASP.NET MVC de la Microsoft și aș folosi-o pentru a parcurge codul dumneavoastră. Astfel veți putea vedea exact ce magie fac 🙂 –  > Por mkchandler.
  • va funcționa doar pentru scenariul de colectare a formularelor sau și pentru altele ? –  > Por Krish.
3 răspunsuri
Jordan

UpdateModel() este o metodă de ajutor Controller care încearcă să lege o mulțime de surse de date de intrare diferite (date HTTP POST provenind de la o vizualizare, valori QueryString, variabile de sesiune/Cookie etc.) la obiectul de model explicit pe care îl indicați ca parametru. În esență, este destinată doar pentru legarea modelului.

Dacă exprimați parametrii de intrare pentru acțiunea dvs. ca un model puternic tipizat (cum ar fi un model de vizualizare), ați făcut deja toți pașii care se fac în spatele scenei atunci când este apelat UpdateModel(). Dacă preluați un obiect din DataContext și îi modificați proprietățile, SaveChanges() este tot ceea ce aveți nevoie pentru a trimite actualizările înapoi în baza de date (în acest caz, Save()).

Exemplu:

//
// POST: /Dinners/Edit/2

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(DinnerViewModel incoming) {

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID);
    dinner.Description = incoming.Description;
    dinnerRepository.Save();

    return RedirectToAction("Details", new { id = incoming.DinnerID });
}

Cu toate acestea, există un caz de utilizare pentru UpdateModel() cu un model puternic tipizat: atunci când treceți un model puternic tipizat și doriți ca valorile sale să le înlocuiască direct pe cele ale unei entități din baza de date (cu condiția ca toate să fie denumite și tipizate la fel). În acest caz, veți prelua obiectul, veți utiliza UpdateModel() pentru acesta, iar operațiunea de legare a modelului va introduce în obiectul preluat toate proprietățile cu nume și tipare similare din obiectul cu tipare puternică. Cu alte cuvinte, se va efectua reflecție pentru dumneavoastră.

Astfel, ca în exemplul dumneavoastră, dacă doriți ca toate proprietățile să se actualizeze fără a specifica care dintre ele să fie actualizate, iar modelul puternic tipizat și modelul bazei de date au proprietăți cu nume similare, ar trebui să utilizați UpdateModel() pentru a profita de reflecție.

Exemplu:

//
// POST: /Dinners/Edit/2

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(DinnerViewModel incoming) {

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID);
    UpdateModel(dinner);
    dinnerRepository.Save();

    return RedirectToAction("Details", new { id = incoming.DinnerID });
}

Singurul avantaj în acest caz (față de utilizarea unui obiect FormCollection) este că veți avea acces la toate celelalte proprietăți ale obiectului puternic tipizat (după cum se arată în incoming.DinnerID).

Concluzie: dacă transformați un obiect puternic tipizat într-un obiect derivat, probabil că cel mai simplu este să utilizați UpdateModel(). Cu toate acestea, este în mare parte inutil dacă actualizați doar câteva proprietăți ale obiectului derivat. De asemenea, rețineți că utilizarea Entity Framework (în loc de ceva de genul Linq to SQL) face ca toate acestea să fie discutabile, deoarece acesta poate relaționa obiectele puternic tipizate și obiectele derivate cu propriile sale metode.

Comentarii

  • UpdateModel Function va funcționa doar pentru scenariul de colectare a formularelor sau și pentru altele ? –  > Por Krish.
Andrei Rînea

Acesta inspectează toate intrările HttpRequest, cum ar fi Form, QueryString, Cookies și variabilele serverului. Cred că în această ordine.

Comentarii

  • UpdateModel Function va funcționa doar pentru scenariul de colectare a formularelor sau și pentru alte scenarii ? –  > Por Krish.
Rahul Mahajan

În loc să transmitem obiectul Model ca parametru la metoda de acțiune „Post()”, creăm o instanță a unui obiect Model în cadrul funcției „Post()” și îl actualizăm folosind funcția „UpdateModel()”. Funcția „UpdateModel()” inspectează toate intrările HttpRequest, cum ar fi datele din formularul postat, QueryString, cookie-urile și variabilele serverului și completează obiectul angajat.

De exemplu

[HttpPost]
[ActionName("Create")]
public ActionResult Create_Post()
{
        EmployeeBusinessLayer employeeBusinessLayer =
            new EmployeeBusinessLayer();
        Employee employee = new Employee();
        UpdateModel(employee);
        employeeBusinessLayer.AddEmmployee(employee);
        return RedirectToAction("Index");
}