我有一个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
对象制作了一个自定义模型绑定器。(见下面的答案)