Изменение ASP.NET MVC 2 ActionResult на пост HTTP - PullRequest
4 голосов
/ 03 мая 2010

Я хочу выполнить некоторую обработку атрибута перед возвратом представления. Если я установил appModel.Markup, возвращенный в методе HttpPost ActionResult ниже, в значение «модифицированный», то в форме он все равно будет «оригинальным». Почему я не могу изменить свой атрибут в методе HttpGet ActionResult?

    [HttpGet]
    public ActionResult Index()
    {
        return View(new MyModel
        {
            Markup = "original"
        });
    }

    [HttpPost]
    public ActionResult Index(MyModel appModel)
    {
        return View(new MyModel
        {
            Markup = "modified"
        });
    }

1 Ответ

4 голосов
/ 03 мая 2010

Потому что «оригинал» хранится в ModelState. Когда значения формы собираются на стороне MVC, они сохраняются в ModelState объекте. Вы вероятно использовали Html.TextBox помощник. Когда вы воссоздаете представление после POST, оно сначала просматривает ModelState и, если есть опубликованное значение, устанавливает это значение. Значение в объекте модели больше не считается.

Одним из решений является следование шаблону POST-REDIRECT-GET. Сначала POST, сделайте что-нибудь с данными, а затем перенаправьте:

[HttpPost]
public ActionResult Index(MyModel appModel)
{
    //do something with data
    return RedirectToAction("Index");
}

Если вы хотите передать что-то между перенаправлениями, вы можете использовать TempData:

[HttpPost]
public ActionResult Index(MyModel appModel)
{
    //do something with data
    TempData["Something"] = "Hello";
    return RedirectToAction("Index");
}

[HttpGet]
public ActionResult Index()
{
    var something = TempData["Something"]; //after redirection it contains "Hello"
}

После перенаправления ModelState больше не используется, поэтому значение переопределения отсутствует. Шаблон POST-REDIRECT-GET также помогает избавиться от эффекта перепечатывания формы при нажатии клавиши F5 в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...