2012-12-26 58 views
2

具有這種結構:MVC模型綁定不上嵌套循環結合簡單對象

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="[email protected](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(表格)在AddToCartProductViewModel(產品)不綁定的時候接收參數。

我有一些想法,爲什麼屬性不綁定到產品,以及如何做一些魔術在這裏和那裏得到從一些嵌套循環填充單個對象的形式(其中一個會希望請求中的集合對象[一個是該框架]),但無法找到一個優雅的解決方案,讓這種形式場景綁定到AddToCartProductViewModel。

我可以使它'直接'使用屬性直接進入AddToCart方法,但是然後我在模型視圖上失去驗證(dataannotations)。

我怎樣才能讓MVC綁定這些屬性的AddToCartProductViewModel視圖模型

+0

你可以顯示完整的AddToCartProductViewModel嗎?特別是公共財產? –

+0

完成,我有{get;設置;},這不是問題。 –

回答

0

我想你可以嘗試:

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

解決一些問題帶來了另一個。 用html標籤手動完成,並保留數據註釋驗證。

可能是一個混亂的viewmodel問題,我只是不知道,沒有時間或資源,使其工作,因爲我想現在。也許我會在未來嘗試着解決。

不知道是否有辦法解決問題或做什麼?編輯隨時隨地更新這個,只要你喜歡。 :D