2017-11-12 9 views
0

私はオブジェクトAを持っています。List<ObjectB> ObjectBにはいくつかのプロパティがあります。 IdMandatoryNameなどMVC、ポスト部分モデル

だから私はのviewmodel(ObjectA)を返し、私のかみそりでこれを持っている:

@model ObjectA 
<div> 
<div>@Html.HiddenFor(m => ObjectA.ObjectC.ID) 
    <dl class="dl-horizontal"> 
     <dt> 
      @Html.DisplayNameFor(model => ObjectA.ObjectC.Name) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => ObjectA.ObjectC.Name) 
     </dd> 
    </dl></div> 
    // display stuff from objectA 
    @using (Html.BeginForm()) 
    { 
     foreach (var ft in ObjectA.ObjectB) 
     { 
      @Html.HiddenFor(c => ft.ID) 
      <div class="row"> 
       <div class="col"> 
       @if (ft.Mandatory) 
       { 
        @Html.CheckBoxFor(c => ft.Mandatory, new { id = ft.ID, disabled = "disabled" }) 
        @Html.HiddenFor(c => ft.Mandatory) 
       } 
       else 
       { 
        @Html.CheckBoxFor(c => ft.Mandatory, new { id = ft.ID }) 
       } 
       </div> 
     </div> 
    </div> 
</div> 

、私のコントローラで私が入力パラメータとして試してみました: List<ObjectB> items それがnullでした。今私はFormCollectionを試してみることができ、form.Get("ft.id")にobjectBリストのアイテムの量があることを知りました。必須でも同じです。 しかし、私はそれが強いタイプのを入力したいと思います。いずれか:タイプBの全てのサブオブジェクトタイプをObjectBのIEnumerableを

2リスト/付き

1オブジェクトA。

これはおそらく小さなものですが、私は今はそれを見ることができません。

編集私のモデル:

public class ObjectA : BaseViewModel 
{ 
    public ObjectC DisplayOnly { get; internal set; } 

    public List<ObjectB> Features { get; set; } 
} 

マイビュー:(上記参照) マイコントローラ:あなたの現在のコードで

[Route("Details/{id:int}")] 
[HttpPost] 
public ActionResult Details(ObjectA vm) 
{ 
    if (ModelState.IsValid) 
    { 
     int hid = Convert.ToInt32(RouteData.Values["id"]); 
    } 
} 
+0

モデル 'ObjectA'を投稿すると、HTMLレベルで私は眉の理由を見ませんすべてのフィールドを送信するが、HTMLフォームに存在するものだけを送信する。したがって、 'List 'をあなたのコントローラの入力として受けようとするのは意味がありません。 – derloopkat

+0

'ObjectA'のすべての小道具が表示されます。 ObjectBは、拡張された選択リストの一種です。 ID、必須、名前、価格、説明などです。したがって、objectBの変更だけが必要です。しかし、すべてのオブジェクトAは大丈夫です。それを試して、nullだった。 –

答えて

1

を、それはname属性を持つチェックボックスinput要素をレンダリングします値はft.Mandatoryに設定されます。フォームが送信されるとき、モデルバインダーは、ビューモデルプロパティー名/プロパティー階層と一致しないため、これをどこにマップするか分かりません。モデルバインディングを機能させるには、入力の名前とパラメータークラスのプロパティー名が一致する必要があります。

エディタテンプレートを使用して、この使用例を処理できます。

EditorTemplatesというフォルダを~/Views/Sharedまたはに作成し、新しいビューを作成し、チェックボックスに必要なデータを表すために使用しているクラス名と同じ名前を付けます。あなたの場合はそれはObjectB.cshtml

このタイプの表示を強くタイプしてOptionBにして、チェックボックスと隠れた入力を描画します。

@model OptionB 
<div> 
    @Html.CheckBoxFor(x => x.Mandatory) 
    @Html.HiddenFor(c => c.Id) 
</div> 

フォームが送信されたときにブラウザが無効にフォーム要素の値を送信しません、覚えておいてください。

メインビューでEditorForヘルパーメソッドを呼び出すことができます。

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(a=>a.OptionBList) 
    <button type="submit">Send form</button> 
} 

これは、チェックボックス

Options[0].Mandatory 
Options[1].Mandatory 
Options[2].Mandatory 

あなたは単にOptionAを使用することができるため、非表示の入力と一緒に、(あなたがOptionBListの3つの項目を持っていると仮定すると)このような名前の属性値を持つチェックボックスをレンダリングしますあなたのHttpPostアクションメソッドのパラメータ

[HttpPost] 
public ActionResult Create(OptionA model) 
{ 
    foreach(var item in model.OptionBList) 
    { 
    //check item.Mandatory and item.Id 
    } 
    //to do : return something 
} 
+0

しかし、私はすべてのチェックボックスをチェックしたリストを受け取りたいと思います。いくつかは必須であるため、デフォルトで選択され、読み取り専用/無効化されます。しかし、私はコントローラのアクションにもそれらを必要とします。 –

+0

これは、すべてのチェックボックス(OptionBListの各アイテムの1つ)を与えます。答えに対する私の更新を見てください。無効なチェックボックスは送信されません。 – Shyju

+1

あなたのエディタテンプレートがうまくいくようです。私は入力パラメータなしでモデルにコンストラクタを追加しなければならなかった。しかし、それは今戻ってポストし、リストはnullではありません。 –