2011-04-21 94 views
7

我发现了一个奇怪的场景,防止布尔?正确地发送回控制器。这是一个非常具体的问题,因此请按照重新创建的步骤操作。ASP.Net MVC3模型绑定错误

应用程序必须作为虚拟文件夹部署在IIS中,以便/ home/Test URL不是/ Virtual/Home/Test。

首页控制器:

[HttpGet] 
public ActionResult Test(int? temp, bool? testBool) 
{ 
    return View(testBool); 
} 

/主页/测试视图(剃刀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") 
} 

在回来后的布尔?由于int而不会使其成为控制器?之前它在参数列表中。这可以通过把布尔解决?在int之前?在参数列表中,但显然你不应该这样做。如果不在IIS上的虚拟文件夹中,它也可以正常工作。如果使用POST方法也存在同样的问题,但是发布的是bool而不是bool?可以工作,但如果不在虚拟文件夹中则不需要,所以不必这样做。

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

如果这只是一个错误,有没有人知道什么是提交错误报告正确的ASP.Net MVC频道?

更新:

我发现,如果你有在动作参数的任何数量的可空变量,只有第一个将永远工作者和所有其他人将无法被填充。任何人都知道这是设计还是错误?

回答

1

显然这仍然是一个问题。以为它现在已经被修复了。解决这个问题的一个方法是将其添加到您的Application_Start方法中。

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); 

添加这将允许可为空的参数行为适当。我很惊讶这个错误仍然存​​在,因为它在12月被称为RC2。

本文中路由可选参数之间的区别是,在您的示例中,路由不是问题。在这种情况下,您正在发布(或查询字符串)数据,并且不会正确填充可空行为参数。我已经检查过mvc3源代码,并且不明白为什么这应该是一个问题,因为它调试它似乎正常工作,并通过源结果以预期的行为步进。我相当肯定,即使Scott Guthrie说现在应该是现在,这个问题还没有解决......

+0

工作!优秀。按照说明在Global.asax.cs中只添加你说的那一行到Application_Start方法。开始担心没有人会得到这个答案。希望这个错误能够在未来的更新中由MVC团队解决。谢谢你的帮助。 – 2011-05-05 09:43:53

+0

太棒了,@克里斯。很高兴为你工作。奇怪的是,它在当地调试时很有效,这让我想知道我的测试服务器上安装了什么版本......:) – Buildstarted 2011-05-05 14:24:20

+0

也许你拥有比我更新的MVC3版本。我将不得不检查是否有更新的版本可用。你是否真的拥有像/ Virtual/Home/Test这样的虚拟目录?如果不正确的话,会有很多比特会导致它在我的帖子中详述的所有内容。 – 2011-05-05 14:26:22

3

This文章可能对您有用。

+0

这是一个类似的错误,可能是相关的。不幸的是,错误和解决方法与连续的可选路由值有关,而我的问题是在URL之后的URL中的参数。 – 2011-04-21 14:10:28

+0

(+1)我在您链接的文章上留下了一篇文章,看看是否也可以在那里获得任何反馈。 – 2011-04-21 14:20:40