我们在MVC3中使用Html.HiddenFor时偶尔出现绑定不正确的问题。我们无法复现它,但是我们在日志中看到了nullrefs,并且这让我们非常困扰。
我们有以下的模型和控制器结构:
public class DummyController
{
[HttpGet]
public ActionResult ReturnAPage(int NumericID)
{
//NumericID should never be 0 or negative, but let's check to make sure
if (NumericID < 1)
{
return RedirectToAction("TracyJordanStabbingRobot");
}
return View("DummyView", new DummyViewModel(NumericID));
}
[HttpPost]
public ActionResult TakePageSubmission(DummyViewModel model)
{
//AnObject relies on having a non-zero ID
ComplexObject AnObject = new ComplexObject(model.NumericID);
AnObject.UseMe();
}
}
public class DummyViewModel
{
public DummyViewModel() {}
public DummyViewModel(int ID)
{
NumericID = ID;
}
public int NumericID { get; set; }
}
...和以下视图结构:
DummyView.cshtml
@model DummyViewModel
<html>
<head></head>
<body>
<p>THIS IS A VIEW!</p>
<form id="DummyViewForm" action="/RouteTo/TakePageSubmission" method="post">
@Html.Partial("_PartialDummyView", Model)
<input type="submit" value="Submit This!" />
</form>
</body>
</html>
_PartialDummyView.cshtml
@model DummyViewModel
<p>Heard you like views...</p>
@Html.HiddenFor(model => model.NumericID)
考虑到我们在初始控制器操作中检查小于零的值,因此可以推断出
@Html.HiddenFor(model => model.NumericID)
永远不应该具有小于零的值。话虽如此,当我们在
TakePageSubmission
操作中使用AnObject
时,会出现空引用错误。当我们深入记录
model.NumericID
值时,我们发现它以零的形式传递,这是不可能的,因为只有使用非零值才能访问DummyView。我们有点困惑,因为我们无法可靠地重现此问题,所以我们没有任何办法知道可能导致这种情况的原因。有人遇到过类似的情况吗?
编辑:我们正在对表单提交进行ModelState验证,但我们没有检查通过的NumericID是否为0。当我们检查时,模型无效,这证明HiddenFor被设置不正确。此外,页面的路由实际上包括NumericID,例如,我们看到了这种情况的发生:
http://our.site.com/RouteToReturnAPage/1736/
...其中操作的参数明显已设置,模型已正确构建,但由于某种未知原因,HiddenFor NumericID值为0。这真的很令人困惑。
RedirectToAction("TracyJordanStabbingRobot");
前面漏了一个return
? - Forty-Two