HTTP POST时修改ASP.NET MVC 2 ActionResult

4

在返回视图之前,我希望对属性进行一些处理。如果我在下面的HttpPost ActionResult方法中设置返回的appModel.Markup为"modified",但在表单上仍然显示为"original"。为什么我不能在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
因为“原始值”存储在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时重新提交表单的问题。

谢谢。我也找到了一个使用ViewData的解决方案,虽然没有你的解决方案好。 - user152949

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接