Модель ASP.NET MVC, связывающая параметр IList <> - PullRequest
27 голосов
/ 17 марта 2009

[Я решил это сам, см. Мой ответ для причины]

У меня проблемы с получением значений формы для аргумента IList <> в методе контроллера, установленного правильно.

Мой класс контроллера выглядит так:

public class ShoppingBasketController : Controller {

    public ActionResult Index() {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Add(IList<ShoppingBasketItem> items) {
        Session["basket"] = items; // for testing
        return RedirectToAction("Index");
    }
}
public class ShoppingBasketItem {
     public int ItemID;
     public int ItemQuantity;
}

Слегка обрезанная форма:

<% using (Html.BeginForm("Add", "ShoppingBasket")) { %>
    <% int codeIndex = 0;
    foreach (Product product in products) { %>
        <%= Html.Hidden("items[" + codeIndex + "].ItemID", product.Id) %>
        <%= Html.TextBox("items[" + codeIndex + "].ItemQuantity", "0", new { size = "2"}) %>
        <% codeIndex++;
    }
} %>

Который производит разметку как:

<form action="/Basket/Add" method="post">
    <input id="items[0]_ItemID" name="items[0].ItemID" type="hidden" value="1" />
    <input id="items[0]_ItemQuantity" name="items[0].ItemQuantity" size="2" type="text" value="0" />

    <input id="items[1]_ItemID" name="items[1].ItemID" type="hidden" value="2" />
    <input id="items[1]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" />

    <input id="items[2]_ItemID" name="items[2].ItemID" type="hidden" value="3" />
    <input id="items[2]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" />
</form>

Я проверил значения форм, которые отправляются, и они верны. Правильное число ShoppingBasketItem также помещается в Session["basket"], однако оба значения ItemID и ItemQuantity равны нулю. Похоже, что он правильно декодирует список значений формы, но не выбирает сами свойства.

Я использую MVC RC2 и на основе статьи Скотта Хансельмана Я почти уверен, что мой код правильный. Я что-то упустил?

1 Ответ

35 голосов
/ 17 марта 2009

Решение

После загрузки исходного кода MVC я все еще не мог понять, почему он не работает, поэтому я предположил, что это должно быть связано с тем типом, который я пытался связать. Конечно же, виновниками были значения, являющиеся переменными-членами, а не свойствами. Это связано с тем, что механизм связывания модели использует отражение для установки свойств, которые не были найдены при вызове TypeDescriptor.GetProperties(Type).

Обновление класса значения до этого решило проблему (после нескольких часов удара головой о стену я должен добавить !!):

public class ShoppingBasketItem {
    public int ItemID { get; set; }
    public int ItemQuantity { get; set; }
}
...