MVC模型绑定不绑定嵌套循环上的简单对象

时间:2012-12-26 23:05:24

标签: asp.net-mvc binding model-binding

有这样的结构:

Index.cshtml:

@foreach (var category in Model) {
    @Html.DisplayFor(m => category.Products)
}

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(产品)不绑定。

我有一些想法为什么属性不绑定到产品以及我如何在这里和那里做一些魔法来从一些嵌套循环填充单个对象表单(其中一个人期望请求中的集合对象[一个是框架]),但找不到一个优雅的解决方案,让这种形式场景绑定到AddToCartProductViewModel。

我可以“以某种方式”将属性直接用于AddToCart方法,但后来我在模型视图上丢失了验证(dataannotations)。

如何让MVC将这些属性绑定到AddToCartProductViewModel视图模型

2 个答案:

答案 0 :(得分:0)

我想你可以试试:

public RedirectToRouteResult AddToCart([Bind(Prefix="category.Products[0]")]AddToCartProductViewModel product, FormCollectionform, string returnUrl = null) {
    ...
}

答案 1 :(得分:0)

解决一些问题会带来另一个问题。 结束使用html标记手动完成并保留数据注释验证。

可能是一个搞砸了的viewmodel问题,我只是不知道,没有时间或资源让它像我现在想的那样工作。也许我会在将来尝试解决。

不知道是否有办法解决问题或做什么?编辑随时随地更新此内容。 :d