前一段时间,我试图将字典数据从我的视图传递给我的控制器。在网上搜索后我能够这样做(记住这是Scott Hanselman的帖子之一)。我的解决方案就像是
<%for(int index=0; index<Model.Count(); index++){
var property= Model.ElementAt(index);%>
<input type="hidden" name="<%="properties["+index+"].Key"%>"/>
<input type="hidden" name="<%="properties["+index+"].Value"%>"/>
<%}%>
public ActionResult Process(IDictionary<string,string> properties)
{
doSomething();
return View();
}
代码工作了一段时间,然后我做了一些重构并摆脱了这一块代码。今天,我遇到了一个我想再次传递字典的情况。但无论我怎么努力,动作收到的属性参数始终为null。我尝试了上面的代码和
<%for(int index=0; index<Model.Count(); index++){
var property= Model.ElementAt(index);%>
<input type="hidden" name="<%="properties.Keys["+index+"]"%>"/>
<input type="hidden" name="<%="properties.Values["+index+"]"%>"/>
<%}%>
这两个代码都没有用。我再次搜索,但找不到之前帮助过我的帖子。谁能指出我做错了什么?万分感谢。
更新:原来问题是因为生成的html代码没有连续的递增索引。例如,我得到属性[0],属性[1],属性[3] ......(属性[2]缺失)。所以,遇到这种问题时,萤火虫将成为你最好的朋友。
答案 0 :(得分:0)
您的索引器位于错误的位置,它必须是属性对象的索引。
<%for(int index=0; index<Model.Count(); index++{
var property= Model.ElementAt(index);%>
<input type="hidden" name="<%="properties["+index+"].Key"%>"/>
<input type="hidden" name="<%="properties["+index+"].Value"%>"/>
<%}%>
答案 1 :(得分:0)
当我遇到这种问题时,我总是检查FormCollection键,以确保它包含观察键,你可以通过在ActionMethod上放置一个断点来实现这一点。
public ActionResult Process(IDictionary<string,string> properties, FormCollection f)
检查“f”是否有正确的键。
您也可以尝试
TryUpdateModel(properties, "properties");