この構造を持つ:
インデックス.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 (フォーム) はパラメーターを受け取りますが、AddToCartProductViewModel (製品) はバインドしません。
プロパティが製品にバインドされていない理由と、いくつかのネストされたループからデータが取り込まれた単一オブジェクトのフォームを取得するために、あちこちでマジックを実行する方法についていくつかのアイデアがあります (リクエストでコレクション オブジェクトが期待されます [1 つはフレームワーク])。 、まだこの種のフォーム シナリオを AddToCartProductViewModel にバインドする洗練されたソリューションを見つけることができません。
プロパティを AddToCart メソッドに直接使用して「何とか」動作させることができますが、モデルビューで検証 (データ注釈) が失われます。
MVC でこれらのプロパティを AddToCartProductViewModel ビュー モデルにバインドするにはどうすればよいですか