Подтвердить что ты не робот

Текстовое поле возвращается к старому значению, в то время как Modelstate действителен при обратной передаче

Возможно, мне что-то не хватает, но когда у меня есть форма, возвращающая одно действие, значение текстового поля возвращается к старому значению. Следующий пример должен увеличивать значение в текстовом поле на каждом POST. Этого не происходит, значение в модели увеличивается и модель действительна.

ЕСЛИ, однако я очищаю модельное состояние в действии HttpPost (комментарий в коде), все работает так, как ожидалось.

Я что-то пропустил?

Здесь код:

Модель:

public class MyModel
{
    public int MyData { get; set; }
}

Вид:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.MyModel>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) {%>
    <%: Html.TextBoxFor(m => m.MyData)%>   (<%: Model.MyData%>)
                  <%: Html.ValidationMessageFor(m => m.MyData) %> <br />
    State :<%: ViewData["State"] %> <br />
    <input type="submit" />
<% } %>
</asp:Content>

Контроллер:

public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View(new MyModel { MyData = 0 });
    }

    [HttpPost]
    public ActionResult Index(MyModel myModel)
    {
        // ModelState.Clear();
        ViewData["State"] = "invalid";
        if (ModelState.IsValid)
            ViewData["State"] = "Valid";

        var model = new MyModel { MyData = myModel.MyData + 1 };
        return View(model);
    }

}
4b9b3361

Ответ 1

Я только что нашел ответ на этот онлайн.

Трюк состоит в том, чтобы очистить ModelState перед возвратом модели

[HttpPost]
public ActionResult Index(MyModel myModel)
{
    // ModelState.Clear();
    ViewData["State"] = "invalid";
    if (ModelState.IsValid)
        ViewData["State"] = "Valid";

    var model = new MyModel { MyData = myModel.MyData + 1 };

    ModelState.Clear();

    return View(model);
}

Более подробно читайте эти 2 статьи

http://forums.asp.net/p/1527149/3687407.aspx

Asp.net MVC ModelState.Clear

Ответ 2

Вы должны либо использовать шаблон Post-Redirect-Get, либо не использовать Html Helpers.

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

В основном MVC ожидает, что любое повторное отображение из сообщения будет ошибкой проверки и повторно использует опубликованные данные (view ModelState) для повторного отображения, предпочитая данные модели. Указание состоит в том, чтобы не использовать ModelState.Clear().