Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc

ASP.NET MVC3–Binding příklad

V tomto příspěvku popíši, jak namapovat data pomocí “nesouvislých indexů” – ony se ty anglické výrazy špatně překládají, respektive nejsem jazykový odborník.

Problém

Představte si, že máte k dispozici seznam telefonních čísle a jmen a chcete je zobrazit uživateli, který pomocí zaškrtávátka určí, které z nich chce vložit do svého seznamu kontaktů. Běžně se tento problém řeší tak, že se uvažuje, že každý záznam má své ID (identifkátor).

Ale zkusme vyřešit situaci, kdy prostě žádné ID není k dipozici a nebo ho použít nechceme, tedy třída vypadá takto:

  1. public class Contact
  2. {
  3.     public string Name { get; set; }
  4.     public string Phone { get; set; }
  5. }

Zdroj dat nám nahradí tento kód:

  1. public static IEnumerable<Contact> Get()
  2. {
  3.     return new Contact[] {
  4.         new Contact() {Name= "Pepa", Phone= "123456789"},
  5.         new Contact() {Name= "Petr", Phone=  "987654321"},
  6.         new Contact() {Name= "Lopuch", Phone= "456789123"}
  7.     }.AsEnumerable();
  8. }

Kontroler není složitý:

  1. public class HomeController : Controller
  2. {
  3.     [HttpGet]
  4.     public ActionResult Index()
  5.     {
  6.         return View(Contact.Get());
  7.     }
  8. }

A View Index pak vypadá takto:

  1. @model IEnumerable<Contact>
  2. @{
  3.     ViewBag.Title = "Index";
  4. }
  5. <h2>Import - contacts</h2>
  6.  
  7. @using (Html.BeginForm())
  8. {
  9.     foreach (var contact in Model)
  10.     {
  11.     <input type="checkbox" name="index" value="@contact.GetHashCode()" /> @string.Format("{0}-{1}", contact.Name, contact.Phone) <br />
  12.     <input type="hidden" name="@string.Format("[{0}].Name", contact.GetHashCode())" value="@contact.Name" />
  13.     <input type="hidden" name="@string.Format("[{0}].Phone", contact.GetHashCode())" value="@contact.Phone" />
  14.     }
  15.     <input type="submit" value="send" />
  16. }

 

Metoda kontrolleru, který bude zpracovávat přijímaná data, pak vypadá takto:

  1. [HttpPost]
  2. public ActionResult Index(Contact[] contacts)
  3. {
  4.     return View("IndexPosted", contacts);
  5. }

 

a ve View IndexPosted vypisujeme přijaté kontakty pomocí jednoduchého kódu:

  1. <h2>Posted contects</h2>
  2. @foreach (var contact in Model)
  3. {
  4.      @string.Format("{0}-{1}", contact.Name, contact.Phone) <br />
  5. }

A takto se to chová:

imagea po odeslání stlačením tlačítka Send: image

Závěr

Veškeré kouzlo spočívá v checkboxu pojmenovaném index. Hodnota checkboxu je na server odeslána pouze v případě, že je zaškrtnut. MVC3 framework na serveru se pak snaží vytvořit kolekci objektů třídy  Contact (viz cílová akce formuláře Index(Contact[]  contacts)) – a hodnutu index použivá pro nalezení hodnot jednotlivých objektů.

Samozřejmě by se dal tento jednoduchý příklad řešit i jinak, ale všimněte si některých výhod tohoto řešení:

  • uživateli neposíláme žádné ID a Hashcode, který ho do jisté míry nahrazuje, je naprosto umělá hodnota.
  • Metodu pro zpracování dat do formuláře můžeme použít i pro zpracování normálního formuláře
  • díky tomu, ze využíváme model zpracování MVC frameworku, došlo by i k oveření všech podmínek, které bychom pro model případně definovali.

Celý zdrojový kód projektu BindingExample je dostupný na CodePlex – ale prakticky vše je uvedeno v tomto článku.

Poznámka na konec – index se nemusí jmenovat jen index, ale můžeme používat i prefixů při řešení složitějších případů:

  1. @Html.CheckBox("phones.index", new { value = contact.GetHashCode() })
  2.     @Html.Hidden(string.Format("phones[{0}].Name", contact.GetHashCode()), contact.Name)
Zveřejněno Monday, December 26, 2011 11:12 AM by mstr

Upozornění na nové komentáře

Pokud chčeš dostávat upozornění emailem na změny u toho příspěvku,tak se zaregistruj zde.zde

Odebírat komentáře k tomuto příspěvku pomocí RSS

Komentář

# re: ASP.NET MVC3–Binding příklad

Ja bych se bal kolizi a radeji pouzil vlastni pocitadlo.

Monday, December 26, 2011 11:53 AM by Boris Letocha

# re: ASP.NET MVC3–Binding příklad

Mate pravdu, ke kolizi by mohlo dojit - i kdyz jeji pravdepodobnost je velmi mala vzhledem k danemu ucelu - a nejhorsi nasledek by asi bylo nenacteni kolizniho kontaktu. Chtel jsem jen ukazat, ze hodnoty indexu nemusi byt sekvencni.

Stejne dobre muzete pouzit i pocitadlo, GUID apod.  

Monday, December 26, 2011 5:59 PM by mstr

# re: ASP.NET MVC3–Binding příklad

Jeste jeden odkaz = http://stackoverflow.com/questions/5331842/how-likely-is-it-to-get-a-hashcode-collision-with-this-hashcode-function

Vysledek GetHashCode je ale urcen pro rychle porovnavani a tedy je lepsi ho tak, jak jsem ho pouzil, NEPOUZIVAT!

Monday, December 26, 2011 6:06 PM by mstr

# re: ASP.NET MVC3–Binding příklad

I have used this Watch for one or two mthons now. I had to call customer support to order and they were outstanding to talk with.

Tuesday, February 28, 2012 2:17 AM by Benjamin

# re: ASP.NET MVC3–Binding příklad

Tuesday, February 28, 2012 9:44 AM by ymbhdhllzim

# re: ASP.NET MVC3–Binding příklad

TxhliO , [url=http://nikclfmcpniw.com/]nikclfmcpniw[/url], [link=http://jwgfutclctlg.com/]jwgfutclctlg[/link], http://ukgkordbjrtr.com/

Tuesday, February 28, 2012 2:56 PM by bqbrfcaik

# re: ASP.NET MVC3–Binding příklad

Právě jsem dočetl váš blog poprvé tak jsem myslel, že jsem měl vyjádřit, abyste věděli, vaše věci je skvělá a vy máte další následovníka! Mějte příspěvků blíží!

Wednesday, February 29, 2012 2:10 PM by Cheap Wildcard SSL

# re: ASP.NET MVC3–Binding příklad

Thursday, March 01, 2012 7:09 PM by vduwbwk

# re: ASP.NET MVC3–Binding příklad

Velmi pěkný sdílení informací vámi. Byl jsem vyhledávání tohoto typu informací, a naštěstí jsem ji ze svého blogu. Líbí se mi tvůj blog také. Jen tak dál.

Monday, March 19, 2012 2:30 PM by SAN Certificate

# Cheap SSL Certificates

As i was browsing the internet, your article caught my very attention. Your article is very interesting in so many ways. Good thing i take time to read your article and give me a lot of idea regarding with this topic. Thank you for sharing your article on the web.

Wednesday, March 28, 2012 12:48 PM by bizsslcertificate@gmail.com

# re: ASP.NET MVC3–Binding příklad

As i was browsing the internet, your article caught my very attention. Your article is very interesting in so many ways. Good thing i take time to read your article and give me a lot of idea regarding with this topic. Thank you for sharing your article on the web.

Wednesday, March 28, 2012 12:50 PM by Cheap SSL

Vytvoření nového komentáře

(povinný) 
povinný 
(povinný) 
Opiš čísla, která vidíš na obrázku: