0

我在页面上有以下输入:

@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" />
}   

我的印象是发布这些数据应该通过 MVC 中的默认模型绑定器绑定到 IDictionary。但是,我希望字典的键是数字:

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

我使用 Javascript 在客户端验证这些字段,但是如果我关闭 JS 并提交表单而不在框中输入任何内容,我会得到一个InvalidCastException说法,即模型绑定器无法绑定到 someData 集合。

我敢肯定,在以前版本的 MVC 中(我们最近升级了),并且因为 Dictionary 键是可以为空(long?)的,如果为“.Key”输入(即非数字)输入了无效数据,字典只是省略了输入集合。

当然,在这种情况下,您可以在不启用 JS 的情况下提交一个空表单吗?当我提交表单时,我的操作甚至没有被命中(断点),所以我自己无法捕捉到错误并添加到 ModelState...

4

1 回答 1

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

于 2012-12-18T15:56:14.320 回答