有这个结构:
索引.cshtml:
@foreach (var category in Model) {
@Html.DisplayFor(m => category.Products)
}
产品.cshtml:
...
@Html.Partial("_AddToCartProductViewModel", new CheckoutVC.Models.ModelView.AddToCartProductViewModel(Model))
...
_AddToCartProductViewModel.cshtml :
@model CheckoutVC.Models.ModelView.AddToCartProductViewModel
@using (Ajax.BeginForm("AddToCart", "Cart", new AjaxOptions { LoadingElementId = "loading" + Model.IdProduct, OnSuccess = "showMessage", UpdateTargetId = "cart_widget" })) {
@Html.HiddenFor(m => m.IdProduct)
@Html.HiddenFor(m => m.IdPrescriptionType)
@Html.HiddenFor(m => m.PrescriptionRequired)
@Html.HiddenFor(m => m.Quantity)
<span class="p-r-s">@Html.LabelFor(m=>m.IdPrescriptionType)</span>
@Html.DropDownListFor(m=>m.IdPrescriptionType, new SelectList(Model.PrescriptionOptions, "Item1", "Item2"), String.Empty)
<button class="action add @Html.PrescriptionRequiredCss(Model.PrescriptionRequired)" type="submit">agregar al carrito<img class="loading" id="loading@(Model.IdProduct)" alt="" src="@Url.Content("~/Content/images/shared/loading_16x16.gif")" width="16" height="16" /></button>
}
使用此 AddToCartProductViewModel.cs 构造函数:
public AddToCartProductViewModel(ProductCheckoutMinVO product, int quantity = 1) {
IdProduct = product.Id;
PrescriptionRequired = product.PrescriptionRequired;
Quantity = 1;
Promotions = product.Promotions;
}
[Required]
[Min(1)]
public int IdProduct { get; set; }
public int Quantity { get; set; }
public bool? PrescriptionRequired { get; set; }
[Min(0)]
public int IdPrescriptionType { get; set; }
MVC 在提交时生成此请求:
category.Products[0].IdProduct:826
category.Products[0].IdPrescriptionType:0
category.Products[0].PrescriptionRequired:False
category.Products[0].Quantity:1
category.Products[0].IdPrescriptionType:1
X-Requested-With:XMLHttpRequest
问题是,我的控制器 CartController.cs :
public RedirectToRouteResult AddToCart(AddToCartProductViewModel product, FormCollection form, string returnUrl = null) {
...
}
FormCollection (form) 确实接收参数,而 AddToCartProductViewModel (product) 不绑定。
我有一些想法,为什么属性没有绑定到产品,以及我如何在这里和那里做一些魔术来从一些嵌套循环中填充一个单一对象表单(其中一个期望请求中的集合对象[一个是框架]) ,但找不到将这种表单场景绑定到 AddToCartProductViewModel 的优雅解决方案。
我可以使用属性直接将其“以某种方式”工作到 AddToCart 方法中,但随后我失去了模型视图上的验证(数据注释)。
如何让 MVC 将这些属性绑定到 AddToCartProductViewModel 视图模型