Asp MVC Получение списка Моделей (Model Binding To List)

Programming
Предыдущий Следующий

asp net mvc   Используя DefaultModelBinder в ASP.NET MVC, Вы можете связать значение на форме (те которые имею атрибут name) с аргументами метода контролера.
   Но что, если этот аргумент - список, или имеет сложную структуру (класс с разными свойствами)? Вы можете связать отправленную форму с IList <T>?

  Это очень легко, если использовать массив простых типов. Например, предположим, что имеется следующий метод:

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"> 

            <input type="hidden" name="products.Index" value="0" />
            <input name="products[0].Name" value="Beer" />
            <input name="products[0].Cataogry[0]" value="Drink" />
            <input name="products[0].Cataogry[1]" value="Alcoholic" />

            <input type="hidden" name="products.Index" value="1" />
            <input name="products[1].Name" value="Chips" />
            <input name="products[1].Cataogry[0]" value="Food" />

            <input type="hidden" name="products.Index" value="2" />
            <input name="products[2].Name" value="Salsa" />
            <input name="products[2].Cataogry[0]" value="Food" />
            <input name="products[2].Cataogry[1]" value="Condiment" />

            <input type="submit" value="Submit Query" />
</form>
 

Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве Магія зміни: Від ночі до дня
Магія Вечірнього Неба: Відлякуйте втомленість дня і зануртеся у світ загадок і краси