在控制器内调用View()不会立即执行ActionResult代码

时间:2013-01-30 05:28:20

标签: razor asp.net-mvc-4

我有以下控制器操作:

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(..)调用返回时呈现视图?

注意:不要担心这个简单的例子。我们有一个真实的用例,确实需要解决这个问题,但我不想再对这个问题负担。

1 个答案:

答案 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);
    }

这看起来有点像黑客,但在某些情况下似乎是必要的。例如,如果子操作需要告诉顶级操作执行重定向,我们将不知道在子操作完成之前需要重定向,但子操作直到太晚才会完成。这是我能找到的唯一解决方法。