RouteValueDictionary
ビューに渡されるオブジェクトにアタッチされているがあります。このオブジェクトには、ユーザーが選択できるチェックボックスをグリッドに設定するために使用されるSelectedItemsと呼ばれる他のオブジェクトの配列が含まれています。次に、このオブジェクトはコントローラーに戻され、ユーザーがUIを操作する方法に応じて異なる方法でルーティングされるため、RouteValueDictionary
呼び出されたReturnValuesも含まれます。クラスの基本的な設定は、多かれ少なかれ次のようになります。
[Serializable]
public class ItemSelection
{
public object[] SelectedItems { get; set; }
public RouteValueDictionary ReturnValues { get; set; }
public ItemSelection()
{
ReturnValues = new RouteValueDictionary()
{
{ "key1", "routeValue1" },
{ "key2", "routeValue2" },
{ "key3", "routeValue3" }
}
}
}
これは、ReturnValuesプロパティがPOSTで「null」に戻ってきたことを除いて、完全に機能していました。
辞書のマッピングに関するこの投稿を読んだ後、私はビューで次の解決策を思いつきました:
<%
foreach(var key in Model.Keys)
{
Html.Render(Html.HiddenFor(m => m[key]));
}
%>
これにより、各アイテムについて次のように見えるHTMLへの非表示の入力の束がレンダリングされます。
<input id="ReturnValues__key1_" name="ReturnValues.[key1]" type="hidden" value="routeValue1">
私もこの投稿に似たものを試しました:
<%
for (var i = 0; i < Model.Count; i++)
{
Html.Hidden("ReturnValues[" + i + "].Key", Model.ElementAt(i).Key);
Html.Hidden("ReturnValues[" + i + "].Value", Model.ElementAt(i).Value);
}
%>
これをレンダリングします:
<input id="ReturnValues_ReturnValues_0__Key" name="ReturnValues.ReturnValues[0].Key" type="hidden" value="key1">
<input id="ReturnValues_ReturnValues_0__Value" name="ReturnValues.ReturnValues[0].Value" type="hidden" value="routeValue1">
RouteValueDictionary
がコントローラーにポストバックされる場合を除いて、これらはどちらもある程度機能しますが、Values
プロパティはのコレクションからStrings
コレクションにString[1]
なります(つまり、文字列は配列になります)。したがって、引き出されると、辞書のエントリは次のようになります。
{ "key1", "routeValue1" }
これに:
{ "key1", { "routeValue1" } }
何時間もいじってみましたが、何が問題なのかわからないようです。コントローラのコードはToString()
関連する値のにルーティングされているため、完全なルートは次のようになります。/area/controller/System.String[]/
RouteValueDictionary
非表示のフィールドにマッピングするときに欠けているものはありますか?
更新:RouteValueDictionary
オブジェクト用のカスタムモデルバインダーを作成することになりました。(以下の回答を参照)