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:
- public class Contact
- {
- public string Name { get; set; }
- public string Phone { get; set; }
- }
- public static IEnumerable<Contact> Get()
- {
- return new Contact[] {
- new Contact() {Name= "Pepa", Phone= "123456789"},
- new Contact() {Name= "Petr", Phone= "987654321"},
- new Contact() {Name= "Lopuch", Phone= "456789123"}
- }.AsEnumerable();
- }
- public class HomeController : Controller
- {
- [HttpGet]
- public ActionResult Index()
- {
- return View(Contact.Get());
- }
- }
- @model IEnumerable<Contact>
- @{
- ViewBag.Title = "Index";
- }
- <h2>Import - contacts</h2>
- @using (Html.BeginForm())
- {
- foreach (var contact in Model)
- {
- <input type="checkbox" name="index" value="@contact.GetHashCode()" /> @string.Format("{0}-{1}", contact.Name, contact.Phone) <br />
- <input type="hidden" name="@string.Format("[{0}].Name", contact.GetHashCode())" value="@contact.Name" />
- <input type="hidden" name="@string.Format("[{0}].Phone", contact.GetHashCode())" value="@contact.Phone" />
- }
- <input type="submit" value="send" />
- }
Metoda kontrolleru, který bude zpracovávat přijímaná data, pak vypadá takto:
- [HttpPost]
- public ActionResult Index(Contact[] contacts)
- {
- return View("IndexPosted", contacts);
- }
a ve View IndexPosted vypisujeme přijaté kontakty pomocí jednoduchého kódu:
- <h2>Posted contects</h2>
- @foreach (var contact in Model)
- {
- @string.Format("{0}-{1}", contact.Name, contact.Phone) <br />
- }
a po odeslání stlačením tlačítka Send:
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.
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ů:
- @Html.CheckBox("phones.index", new { value = contact.GetHashCode() })
- @Html.Hidden(string.Format("phones[{0}].Name", contact.GetHashCode()), contact.Name)
Žádné komentáře:
Okomentovat