ASP.Net MVC3模型绑定bug

Chr*_*den 7 c# razor asp.net-mvc-3

我发现了一个阻止布尔的奇怪场景?被正确地发回控制器.这是一个非常具体的问题,请按照步骤重新创建.

必须将应用程序部署为IIS中的虚拟文件夹,以便代替/ Home/Test,URL为/ Virtual/Home/Test.

家庭控制器:

[HttpGet]
public ActionResult Test(int? temp, bool? testBool)
{
    return View(testBool);
}
Run Code Online (Sandbox Code Playgroud)

/ Home/Test View(Razor cshtml):

@model bool?
@{
    ViewBag.Title = "Test";
}

@using (Html.BeginForm("Test", "Home", FormMethod.Get))
{
    @Html.CheckBox("testBool", Model ?? false, new { onchange = "this.form.submit();" })
    @Html.Label(Model == true ? "True" : "False")
}
Run Code Online (Sandbox Code Playgroud)

在回帖后布尔?因为int而没有进入控制器?在它之前的参数列表中.这可以通过布尔来解决?在int之前?在参数列表中,但显然你不应该这样做.如果不在IIS上的虚拟文件夹中,它也可以正常工作.如果使用POST方法也存在同样的问题,尽管发布bool而不是bool?确实有效但如果不在虚拟文件夹上则没有必要,所以不应该这样做.

有没有其他人经历过这个,有没有什么可以解释为什么绑定失败或者它只是MVC3中的一个错误?

如果它只是一个错误,有谁知道提交错误报告的ASP.Net MVC频道是什么?

更新:

我发现如果你在动作参数中有任意数量的可空变量,那么只有第一个可以工作,而其他所有变量都无法填充.有人知道这是设计还是错误?

Bui*_*ted 1

显然这仍然是一个问题。以为现在就已经修好了。解决此特定错误的一种方法是将其添加到您的Application_Start方法中。

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();
Run Code Online (Sandbox Code Playgroud)

添加该选项将允许可为空的参数正常运行。我很惊讶这个错误仍然存​​在,因为它在 12 月的 RC2 中被称为。

haacked 文章中的路由可选参数之间的区别在于,在您的示例中,路由不是问题。在这种情况下,您正在发布(或查询字符串)数据,并且没有正确填充可为空的操作参数。我已经检查了 mvc3 源代码,但不明白为什么这应该是一个问题,因为调试它似乎工作正常并且单步执行源代码会产生预期的行为。我相当确定这个问题还没有得到解决,尽管 Scott Guthrie 说现在应该已经解决了......