3

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)持つべきではないことは理にかなっています。

そうは言ってもAnObjectTakePageSubmissionアクションで使用すると、null 参照エラーが発生します。

model.NumericID値のログを掘り下げたところ、値がゼロであることがわかりました。これは、DummyView がゼロ以外の値でしかアクセスできないことを考えると、あり得ないことです

私たちは少し困惑しており、問題を確実に再現することができないため、何が原因である可能性があるのか​​ わかりません. 誰かが前にこのようなことに遭遇したことがありますか?

編集: フォーム ポストで ModelState の検証を行っていますが、通過する NumericID が 0 であるかどうかを確認していません。それを確認すると、モデルが無効であることが判明しました。これは、HiddenFor が取得されていることを証明するだけです。不適切に設定します。さらに、ページへのルートには実際には NumericID が含まれているため、たとえば、次のように発生することが確認されています

http://our.site.com/RouteToReturnAPage/1736/

...アクションのパラメーターが明確に設定されている場合、モデルは正しく構築されていますが、何らかの理由で HiddenFor NumericID の値が 0 になっています。本当に不可解です。

4

2 に答える 2

3

デフォルトの 0 値のバインディングは、投稿中にエラーが発生したために同じビューをリロードしていると考えて、投稿後に MVC View'ing から同じページに移動します。別のアクション呼び出しへのロード/アクション呼び出しで、正しいバインディングが発生します。

ModelState.Clear();ビューをリロードする前に、ハックの回避策があります。

また、ヘルパーを使用して隠しフィールドをまったく作成しないでください。次のようなものです。

<input type="hidden" value="@Model.NumericID" id="NumericID" name="NumericID" />

参照: http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx

于 2013-05-15T04:23:28.023 に答える
0

First you are missing default constructor in your model. Without it applicaiton throws exception when binding.

You can reproduce the error by editing the hidden field on client side. So user can change id to 0 or any other value. If you aren't running you application on distributed enviroment then use TempData to pass the id between actions. This way you will keep id safe from data tampering.

TempData["NumericID"] = NumericID;
于 2013-03-23T07:32:48.687 に答える