为什么mvc在“beginform”中“记住”旧模型?

时间:2013-06-12 10:56:55

标签: c# asp.net-mvc-4 razor-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”方法来实现它,但这似乎是反直觉的)

1 个答案:

答案 0 :(得分:0)

CodeCaster是正确的,因为它几乎是重复的,但是另一个线程的答案并不正确。我在另一个帖子中的一条评论中找到了正确的答案:

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

正确答案是MVC帮助程序直接从请求中读取值。他们这样做是为了能够正确显示错误的提交信息(如int字段中的“dog”)。

另一个线程建议使用“ModelState.Clear()”,但我发现这不起作用。我使用的完美解决方法是使用“RedirectToAction”。