0

私はこれを部分的なビューで持っています

@using (Html.BeginForm(MVC.Inventory.ActionNames.AddVehicles, MVC.Inventory.Name, new { model = Model.Items }))
{
   <div><button>@AuctionControllerResource.AddToBiddingProcess</button></div>
}

投稿方法はこちら

[HttpPost]
        public virtual ActionResult AddVehicles(List<VehicleViewModel> model)
        {
            return null;
        }

ビューにブレークポイントを配置すると、Model.Items に 1 つの項目が含まれていることがわかります。しかし、ボタン クリックで Post アクション メソッドを実行すると、モデルに項目がありません。

これをフォームに追加しました

@Html.HiddenFor(m => m.Items)

しかし、それは役に立ちません。

私は何を間違っていますか?

ありがとう、

サチン

編集

追加コード

 public class ListViewModel<T> : IQuery
        where T : class
    {

        public List<T> Items { get; set; }
     ...
}
4

1 に答える 1

2

以下は、あなたが思っていることをしません:

new { model = Model.Items }

そのような複雑なオブジェクトを渡すことはできません。これを機能させたい場合は、フォームに隠しフィールドを生成する必要があります。

これをフォームに追加しました

@Html.HiddenFor(m => m.Items)

いいえ、役に立たないのは当たり前です。非表示フィールドは、単純型でのみ機能します。コレクション内のアイテムをループして、各要素の各プロパティに対応するフィールドを生成する必要があります。

@using (Html.BeginForm(MVC.Inventory.ActionNames.AddVehicles, MVC.Inventory.Name))
{
    for (var i = 0; i < Model.Items.Count; i++)
    {
        @Html.HiddenFor(x => x.Items[i].Prop1)
        @Html.HiddenFor(x => x.Items[i].Prop2)
        @Html.HiddenFor(x => x.Items[i].ComplexProp3.Prop1)
        @Html.HiddenFor(x => x.Items[i].ComplexProp3.Prop2)
        ...
    }
    <div>
       <button>@AuctionControllerResource.AddToBiddingProcess</button>
    </div>
}

しかし、これはかなり無駄に思えます。ユーザーはフォームでこれらの値を変更することはできないため、POST アクションでデータ ストアから対応するアイテムを取得できるように、単純に ID を渡すことをお勧めします。

@using (Html.BeginForm(MVC.Inventory.ActionNames.AddVehicles, MVC.Inventory.Name, new { id = Model.ItemsId }))
{
    <div>
       <button>@AuctionControllerResource.AddToBiddingProcess</button>
    </div>
}

その後:

[HttpPost]
public virtual ActionResult AddVehicles(int id)
{
    List<VehicleViewModel> model = GetItemsFromDataStore(id);
    ...
}
于 2013-03-15T15:10:32.053 に答える