|
Programmer ASP.NET MVC C# |
Programming
|
||
Предыдущий | Следующий | |
Используя DefaultModelBinder в ASP.NET MVC, Вы можете связать значение на форме (те которые имею атрибут name) с аргументами метода контролера. Это очень легко, если использовать массив простых типов. Например, предположим, что имеется следующий метод: public ActionResult UpdateInts(IList<int> ints) { return View(ints); } Можно собрать данные, просто представляя связку полей формы с одним и тем же атрибутом name. Например, форма, которая собрала бы аргумент ints в массив(нужно что бы каждый элемент формы имел value целым числом, по другому не соберет в IList<int>, но сможет собрать в IList<object>): <form method="post" action="/Home/UpdateInts"> <input type="text" name="ints" value="1" /> <input type="text" name="ints" value="4" /> <input type="text" name="ints" value="2" /> <input type="text" name="ints" value="8" /> <input type="submit" /> </form> Для списка более сложных типов, этот процесс становиться более хитрым. Предположим что есть следующий класс Рroduct и метод контролера: public class Product { public string Name { get; set; } public decimal Price { get; set; } } //Action method on HomeController public ActionResult UpdateProducts(IList<Product> products) { return View(products); } Для такой сложной сборки было введено служебное слово Index. Его нужно использовать с атрибутом name. На следующем примере будет собрано массив из трех продуктов: <form method="post" action="/Home/UpdateProducts"> <input type="hidden" name="products.Index" value="0" /> <input type="text" name="products[0].Name" value="Beer" /> <input type="text" name="products[0].Price" value="7.32" /> <input type="hidden" name="products.Index" value="1" /> <input type="text" name="products[1].Name" value="Chips" /> <input type="text" name="products[1].Price" value="2.23" /> <input type="hidden" name="products.Index" value="2" /> <input type="text" name="products[2].Name" value="Salsa" /> <input type="text" name="products[2].Price" value="1.23" /> <input type="submit" /> </form> Нужно заметить, что индекс не должен быть обязательно числом. Он просто должен быть равен для одного и того же объекта. Т.е. и так тоже можно: <form method="post" action="/Home/UpdateProducts"> <input type="hidden" name="products.Index" value="cold" /> <input type="text" name="products[cold].Name" value="Beer" /> <input type="text" name="products[cold].Price" value="7.32" /> <input type="hidden" name="products.Index" value="123" /> <input type="text" name="products[123].Name" value="Chips" /> <input type="text" name="products[123].Price" value="2.23" /> <input type="hidden" name="products.Index" value="caliente" /> <input type="text" name="products[caliente].Name" value="Salsa" /> <input type="text" name="products[caliente].Price" value="1.23" /> <input type="submit" /> </form> Я не проверял, но может быть будет работать даже такой фокус: <form method="post" action="/Home/UpdateProducts"> |