2012-12-18 18 views
0

我有一个页面上的以下输入:MVC4模型绑定到词典(重大更改?)

@using(Html.BeginForm()) 
{ 
    @Html.TextBox(String.Format("someData[{0}].Key", 0)) 
    @Html.TextBox(String.Format("someData[{0}].Key", 1)) 

    @Html.TextBox(String.Format("someData[{0}].Value", 0)) 
    @Html.TextBox(String.Format("someData[{0}].Value", 1)) 

    <input type="submit" value="Go" /> 
} 

我的印象是,发布此数据应通过在默认的模型绑定绑定到一个IDictionary MVC。不过,我想字典的关键是数字:

public ActionResult MyAction(IDictionary<long?, string> someData) 
{ 
    //... 
} 

使用JavaScript来验证客户端上的这些字段,但是如果我把JS关闭,并提交表单,而不在框中输入任何内容,我得到一个InvalidCastException说模型联编程序不能绑定到someData集合。

我敢肯定,在MVC以前的版本(我们最近升级),并因为字典键可为空(long?),如果无效数据的'。重点的投入进入(即非数字),字典只是省略了集合中的条目。

当然,您可以在这种情况下提交一个没有启用JS的空表单吗?我的行为是不是连打(断点)当我提交表单,所以我不能抓住自己的错误,并添加到ModelState中......

+0

为什么不使用强类型模型绑定方法? – Shyju

+0

这很复杂!该页面有一个ViewModel,但是这是非常定制的功能添加到现有的视图(这是共享),并只在非常特定的情况下使用。试图添加一些不那么好的遗留代码的乐趣:( –

回答

1

这工作正常,我用:

[HttpGet] 
public ActionResult Index() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Index(IDictionary<long?, string> someData) 
{ 
    if (ModelState.IsValid) 
    { 
     // do some stuff here... 
    } 
    return View(); 
} 

然而,以空值发布,将产生无效投射,并且是已知问题,此处已标识:http://aspnetwebstack.codeplex.com/workitem/373

+0

看起来像这是一个实际的突破性变化然后。 –