我有以下控制器操作:
public ActionResult MyAction(...)
{
ActionResult result = View("MyView", new MyModel());
var fruit = TempData["Fruit"];
// Do something with the fruit
return result;
}
和这个MyView.cshtml
@model MyModel
@{
TempData["Fruit"] = "Mango";
}
当我在设置了TempData["Fruit"]
的视图中放置一个断点时,它不会在Action中的“return result
”之前调用。 Razor
呈现似乎被延迟了。
如何强制从result = View(..)
调用返回时呈现视图?
注意:不要担心这个简单的例子。我们有一个真实的用例,确实需要解决这个问题,但我不想再对这个问题负担。
答案 0 :(得分:1)
直到Action完成后才会呈现视图。你可以调用result.ExecuteResult(ControllerContext)来强制在行动中尽早执行ActionResult,如下所示:
ActionResult result = View("Details", new PageModel(page));
result.ExecuteResult(ControllerContext);
但是你会遇到问题,因为当动作返回结果时,ActionResult将再次执行 ,所以你必须取消第二次执行。
你可以这样做:
protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
if (cancelTheResult)
{
filterContext.Cancel = true;
}
base.OnResultExecuting(filterContext);
}
这看起来有点像黑客,但在某些情况下似乎是必要的。例如,如果子操作需要告诉顶级操作执行重定向,我们将不知道在子操作完成之前需要重定向,但子操作直到太晚才会完成。这是我能找到的唯一解决方法。