ASP.NET Модель MVC, привязывающая IList<> параметр
-
19-08-2019 - |
Вопрос
[Я решил это сам, смотрите Мой ответ о причине]
У меня возникли проблемы с получением значений формы для 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 и основываюсь на статья Скотта Хансельмана Я почти уверен, что мой код верен.Я что-то упускаю?
Решение
Решение
После загрузки исходного кода MVC я все еще не мог понять, почему это не сработает, поэтому я предположил, что это должно быть как-то связано с типом, который я пытался привязать.Конечно же, виновником были значения, являющиеся переменными-членами, в отличие от свойств.Это связано с тем, что model binder использует отражение для задания свойств, которые он не нашел с помощью вызова TypeDescriptor.GetProperties(Type)
.
Обновление класса value до этого решило проблему (после нескольких часов удара головой о стену я должен добавить !!):
public class ShoppingBasketItem {
public int ItemID { get; set; }
public int ItemQuantity { get; set; }
}