MVC5 模型绑定到 DropdownList
MVC5 Model Binding to DropdownList
我不知道为什么我的模型没有正确绑定到下拉列表,我已经在其他几个地方成功地做到了,但在这里没有用。这是一个购物车,只需要一个数量下拉列表来更新购物车,并显示数据库中的当前数量。
型号:
public class CartViewModel
{
public List<CategoryModel> Categories { get; set; }
public CartModel Cart { get; set; }
public IEnumerable<SelectListItem> Quantities { get; set; }
}
public class CartModel
{
public List<CartItem> Items { get; set; }
}
public class CartItem
{
public int ProductId { get; set; }
public string Name { get; set; }
public int Quantity { get; set; }
public float Price { get; set; }
public float TotalPrice { get; set; }
public string ImageName { get; set; }
}
Class 数量,0-10
public class QuantityList
{
public static IEnumerable<SelectListItem> QtyList = new List<SelectListItem>()
{
new SelectListItem() {Text="0", Value="0" },
new SelectListItem() {Text="1", Value="1" },
new SelectListItem() {Text="2", Value="2" },
new SelectListItem() {Text="3", Value="3" },
new SelectListItem() {Text="4", Value="4" },
new SelectListItem() {Text="5", Value="5" },
new SelectListItem() {Text="6", Value="6" },
new SelectListItem() {Text="7", Value="7" },
new SelectListItem() {Text="8", Value="8" },
new SelectListItem() {Text="9", Value="9" },
new SelectListItem() {Text="10", Value="10" }
};
}
查看
@using (Html.BeginForm("UpdateCart", "Cart", FormMethod.Post))
{
for (int i = 0; i < Model.Cart.Items.Count; i++)
{
<div class="CartItem">
<span class="ItemName">@Model.Cart.Items[i].Name</span>
**<span class="ItemQty">@Html.DropDownListFor(m => Model.Cart.Items[i].Quantity, Model.Quantities)</span>**
<span class="RemoveItem">@Html.ActionLink("Remove", "RemoveItem", new { ProductId = Model.Cart.Items[i].ProductId })</span>
</div>
}
}
除下拉列表外,一切都正确加载和呈现,我什至使用了 TextBoxFor 并且它使用正确的值正确呈现,但在尝试绑定到预填充的 selectlistitems 列表时却没有
您可以直接转到静态列表,而不是将列表绑定到视图模型:
@Html.DropDownListFor(m => Model.Cart.Items[i].Quantity, QuantityList.QtyList)
因为您可以绑定定义了列表的任何内容。至于为什么默认值不起作用,我没有看到将 QtyList 静态变量传递给视图模型的数量的代码 属性.
这是在 for
循环中使用 DropDownListFor()
的不幸限制(它在 CodePlex 上被报告过几次)。您需要为 typeof CartItem
使用 EditorTemplate
并使用 AdditionalViewData
将 SelectList
传递给它,或者在每次迭代中生成一个新的 SelectList
并设置Selected
属性.
for (int i = 0; i < Model.Cart.Items.Count; i++)
{
....
@Html.DropDownListFor(m => m.Cart.Items[i].Quantity, new SelectList(Model.Quantities, "Value", "Text", Model.Cart.Items[i].Quantity)
....
}
请注意,您可以将代码简化为
public class CartViewModel
{
public List<CategoryModel> Categories { get; set; }
public List<CartItem> Items { get; set; }
public int[] Quantities { get; set; }
}
并使用 model.Quantities = Enumerable.Range(0, 10);
和视图
填充 Quantities
@Html.DropDownListFor(m => m.Items[i].Quantity, new SelectList(Model.Quantities, Model.Items[i].Quantity)
我不知道为什么我的模型没有正确绑定到下拉列表,我已经在其他几个地方成功地做到了,但在这里没有用。这是一个购物车,只需要一个数量下拉列表来更新购物车,并显示数据库中的当前数量。
型号:
public class CartViewModel
{
public List<CategoryModel> Categories { get; set; }
public CartModel Cart { get; set; }
public IEnumerable<SelectListItem> Quantities { get; set; }
}
public class CartModel
{
public List<CartItem> Items { get; set; }
}
public class CartItem
{
public int ProductId { get; set; }
public string Name { get; set; }
public int Quantity { get; set; }
public float Price { get; set; }
public float TotalPrice { get; set; }
public string ImageName { get; set; }
}
Class 数量,0-10
public class QuantityList
{
public static IEnumerable<SelectListItem> QtyList = new List<SelectListItem>()
{
new SelectListItem() {Text="0", Value="0" },
new SelectListItem() {Text="1", Value="1" },
new SelectListItem() {Text="2", Value="2" },
new SelectListItem() {Text="3", Value="3" },
new SelectListItem() {Text="4", Value="4" },
new SelectListItem() {Text="5", Value="5" },
new SelectListItem() {Text="6", Value="6" },
new SelectListItem() {Text="7", Value="7" },
new SelectListItem() {Text="8", Value="8" },
new SelectListItem() {Text="9", Value="9" },
new SelectListItem() {Text="10", Value="10" }
};
}
查看
@using (Html.BeginForm("UpdateCart", "Cart", FormMethod.Post))
{
for (int i = 0; i < Model.Cart.Items.Count; i++)
{
<div class="CartItem">
<span class="ItemName">@Model.Cart.Items[i].Name</span>
**<span class="ItemQty">@Html.DropDownListFor(m => Model.Cart.Items[i].Quantity, Model.Quantities)</span>**
<span class="RemoveItem">@Html.ActionLink("Remove", "RemoveItem", new { ProductId = Model.Cart.Items[i].ProductId })</span>
</div>
}
}
除下拉列表外,一切都正确加载和呈现,我什至使用了 TextBoxFor 并且它使用正确的值正确呈现,但在尝试绑定到预填充的 selectlistitems 列表时却没有
您可以直接转到静态列表,而不是将列表绑定到视图模型:
@Html.DropDownListFor(m => Model.Cart.Items[i].Quantity, QuantityList.QtyList)
因为您可以绑定定义了列表的任何内容。至于为什么默认值不起作用,我没有看到将 QtyList 静态变量传递给视图模型的数量的代码 属性.
这是在 for
循环中使用 DropDownListFor()
的不幸限制(它在 CodePlex 上被报告过几次)。您需要为 typeof CartItem
使用 EditorTemplate
并使用 AdditionalViewData
将 SelectList
传递给它,或者在每次迭代中生成一个新的 SelectList
并设置Selected
属性.
for (int i = 0; i < Model.Cart.Items.Count; i++)
{
....
@Html.DropDownListFor(m => m.Cart.Items[i].Quantity, new SelectList(Model.Quantities, "Value", "Text", Model.Cart.Items[i].Quantity)
....
}
请注意,您可以将代码简化为
public class CartViewModel
{
public List<CategoryModel> Categories { get; set; }
public List<CartItem> Items { get; set; }
public int[] Quantities { get; set; }
}
并使用 model.Quantities = Enumerable.Range(0, 10);
和视图
Quantities
@Html.DropDownListFor(m => m.Items[i].Quantity, new SelectList(Model.Quantities, Model.Items[i].Quantity)