2

フォームを複数回再表示すると、MVC で非常に奇妙な動作が発生することがわかりました。誰かが何が起こっているのかを明確にするのを手伝ってくれるかどうか疑問に思っていました:

私のコントローラーコード:

   [HttpPost, ActionName("Delete")]
    public ActionResult Delete(Person person)
    {
        if (person.PersonID != default(int))
        {
            try
            {
                _personRepository.Delete(person.PersonID);
                _personRepository.Save();
            }
            catch (Exception)
            {
            }
        }

        return PartialView(new Person() {Name = Lang("Personen er slettet")});
    }

私のビューコード:

@model Person
<h3>@Html.Lang("Er du sikker på at du vil slette")?</h3>
<div>@Html.DisplayNameFor(m => m.Name): "@Model.Name"</div>
<div>@Html.DisplayNameFor(m => m.PersonID): "@Model.PersonID"</div>
@{
    var id = Model.PersonID;
}
@using (Html.BeginForm())
{
    <p>
        @Html.HiddenFor(m => Model.PersonID)
        @Html.HiddenFor(m => Model.Name)
        <input type="hidden" value="@Model.PersonID" id="personID" name="personID"/>
        <input type="hidden" value="@Model.Name" id="Name" name="Name"/>
    </p>
}

Delete(Person person) 関数がビューを返すときに得られる結果:

<h3>Er du sikker p&#229; at du vil slette?</h3>
<div>Navn: "Personen er slettet"</div>
<div>PersonID: "0"</div>

<form action="/KongsbergGruppenCompanyRegister/Person/Delete?PersonID=10" method="post">    <p>
        <input data-val="true" data-val-required="The PersonID field is required." id="PersonID" name="PersonID" type="hidden" value="10" />
        <input data-val="true" data-val-length="The field Navn must be a string with a maximum length of 255." data-val-length-max="255" id="Name" name="Name" type="hidden" value="dfhgdfgh" />
        <input type="hidden" value="0" id="personID" name="personID"/>
        <input type="hidden" value="Personen er slettet" id="Name" name="Name"/>
    </p>
</form> 

突然モデルが「削除済み」モデルになった場所を指摘させてください。どのように、なぜこれが起こっているのでしょうか?これをコーディングするより正しい方法は何でしょうか? (「hiddenFor」メソッドを使用しないだけで機能させることができますが、それは直感に反するようです)

4

1 に答える 1

0

CodeCaster はほぼ重複しているという点で正しいですが、他のスレッドからの回答は正しいものではありません。他のスレッドのコメントの1つで正しい答えを見つけました:

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

正解は、MVC ヘルパーが要求から直接値を読み取ることです。これは、送信された誤った情報 (int フィールドの「犬」など) を適切に表示できるようにするためです。

他のスレッドは「ModelState.Clear()」の使用を提案しましたが、これは機能しないことがわかりました。私が使用した完全に機能する回避策は、「RedirectToAction」を使用することでした。

于 2013-06-13T04:46:46.017 に答える