2

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オブジェクト用のカスタムモデルバインダーを作成することになりました。(以下の回答を参照)

4

1 に答える 1