6

Post アクションでモデル プロパティを取得する必要があるため、それらの要素を非表示にする必要がありますが、 の型に問題がありDictionary <string, string>ます。これは私のモデルです:

public class ViewModel{
 ...
 public ViewPart ViewPart { get; set; }
}

public class ViewPart {
 ...
 public Dictionary<string, string> Flags { get; set; }
}

そして私のコントローラー:

Dictionary<string, string> flags = new Dictionary<string, string>();
flags.Add("kind", "Edit");
flags.Add("Command", "Save");
ViewModel model = new ViewModel(){ Flags  = flags };
return View(model);

ビューで:

@foreach(var item in Model.ViewPart.Flags) { 
 <input type="hidden" id="ViewPart_Flags_@(item.Key)" value="@item.Value" name="ViewPart.Flags[@(item.Key)]" />
}

また、私はこれを試します:

@foreach(var item in Model.ViewPart.Flags) { 
  @Html.HiddenFor(modelItem => item)
}

投稿アクションの更新:

[HttpPost]
public ActionResult MyPostAction(ViewModel model){
  //model.ViewPart.Flags is null
}

しかし、Post アクションでFlagsは常に null です。なぜですか? 私のせいはどこですか?ビューからアクションに変数を渡すより良い方法はありますか?

4

2 に答える 2

7

ディクショナリにモデルバインドする場合はKey、 用と用の 2 つの非表示フィールドが必要です。Value

var index = 0;
foreach (var item in Model.ViewPart.Flags)
{

    <input type="hidden" value="@item.Key" 
                         name="ViewPart.Flags[@(index)].Key"/>
    <input type="hidden" value="@item.Value" 
                         name="ViewPart.Flags[@(index)].Value"/>

    index++;
}
    <input type="submit" value="Save"/>

モデルバインダーを満足させるには、実行中のインデックスも必要になることに注意してください。

または、実行したくない場合は、追加の非表示Indexフィールドで解決できます。

foreach (var item in Model.ViewPart.Flags)
{

    <input type="hidden" value="@item.Key" 
                         name="ViewPart.Flags.Index"/>
    <input type="hidden" value="@item.Key" 
                         name="ViewPart.Flags[@(item.Key)].Key" />
    <input type="hidden" value="@item.Value" 
                         name="ViewPart.Flags[@(item.Key)].Value" />
}
    <input type="submit" value="Save"/>
}

この 2 つの記事では、コレクションを使用したモデル バインドに関する多くの情報を見つけることができます。

于 2012-07-07T11:08:26.810 に答える
0

投稿アクションをこれに変更します

[HttpPost]
public ActionResult MyPostAction(ViewModel model, ViewPart viewPart)
{
    model.ViewPart.Flags = viewPart.Flags;
}

そしてビューでの使用

@foreach(var item in Model.ViewPart.Flags) { 
  @Html.HiddenFor(modelItem => item)
}

これが機能しない場合は、レンダリングされた HTML のソースを確認し、非表示の情報がレンダリングされているかどうかを確認してください。@Html.HiddenForうまくいくかどうかはわかりませんが、Dictionaryうまくいかない場合は、以前と同じように書き出す必要があるかもしれません。

于 2012-07-07T10:52:40.497 に答える