1

MVC4 アプリケーションのフォームに注文情報が表示されます。ビューのモデルは OrderViewModel です。注文明細のコレクションであるプロパティ Orderlines があります。

注文明細を表示するためにMvcContrib Gridを使用しています。フォームが送信されると、次のコントローラー メソッドが実行されます。

[HttpPost]
public ActionResult PlaceOrder(OrderViewModel model)
{
   ...
}

私の問題は、入ってくるモデル パラメータで Orderlines プロパティが常に null であることです。顧客名などの他のフィールドはビューからビュー モデルにバインドされますが、オーダーライン コレクションはバインドされません。グリッドからのデータを、ポストバック時にコントローラーに送り返されるビュー モデルにバインドする方法はありますか?

よろしく、 ニルス

4

1 に答える 1

0

いつでもカスタム モデル バインダーを作成して、データを入力することができます。これは、内部コレクション プロパティや複雑なオブジェクトを操作する場合に特に便利です。一度理解すれば、これを実装するのは非常に簡単です。との 2 つのクラスを実装する必要がありCustomModelBinderAttributeますIModelBinder

最終的なコードは次のようになります。

[HttpPost]
public ActionResult PlaceOrder([OrderCustomModelBinder] OrderViewModel model)
{
   ...
}

public class OrderCustomModelBinderAttribute : CustomModelBinderAttribute
{
    public override IModelBinder GetBinder()
    {
        return new OrderBinder();
    }
}

public class OrderBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        // your posted form data is in bindingContext.ValueProvider.GetValue("myField")
        // the object you return should be of type OrderViewModel 

        OrderViewModel result = new OrderViewModel();
        // populate Orderlines property

        return result;
    }
}
于 2012-11-21T14:30:42.127 に答える