MVC3 の Html.HiddenFor が適切にバインドされないことがあるという問題があります。まったく再現できませんが、ログに nullref が表示されており、完全に頭がおかしくなっています。
次のモデルとコントローラー構造があります。
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)
持つべきではないことは理にかなっています。
そうは言ってもAnObject
、TakePageSubmission
アクションで使用すると、null 参照エラーが発生します。
model.NumericID
値のログを掘り下げたところ、値がゼロであることがわかりました。これは、DummyView がゼロ以外の値でしかアクセスできないことを考えると、あり得ないことです。
私たちは少し困惑しており、問題を確実に再現することができないため、何が原因である可能性があるのか わかりません. 誰かが前にこのようなことに遭遇したことがありますか?
編集: フォーム ポストで ModelState の検証を行っていますが、通過する NumericID が 0 であるかどうかを確認していません。それを確認すると、モデルが無効であることが判明しました。これは、HiddenFor が取得されていることを証明するだけです。不適切に設定します。さらに、ページへのルートには実際には NumericID が含まれているため、たとえば、次のように発生することが確認されています。
http://our.site.com/RouteToReturnAPage/1736/
...アクションのパラメーターが明確に設定されている場合、モデルは正しく構築されていますが、何らかの理由で HiddenFor NumericID の値が 0 になっています。本当に不可解です。