2

この構造を持つ:

インデックス.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 ビュー モデルにバインドするにはどうすればよいですか

4

2 に答える 2

0

ある問題を解決すると、別の問題が発生します。最終的にはhtmlタグを使用して手動で実行し、データアノテーションの検証を省略しました。

ビューモデルの問題がめちゃくちゃになっている可能性があります。私にはわからないので、今のように機能させるための時間やリソースがありません。多分私は将来的に対処しようとします。

質問を閉じる方法があるかどうか、または何をすべきかわからないのですか?編集者は、これを自由に更新してください。:D

于 2012-12-31T12:18:12.870 に答える
0

私はあなたが試すことができると思います:

public RedirectToRouteResult AddToCart([Bind(Prefix="category.Products[0]")]AddToCartProductViewModel product, FormCollectionform, string returnUrl = null) {
    ...
}
于 2012-12-27T02:08:29.913 に答える