1

我有以下控制器操作:

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"]设置断点时,它不会在return result操作中的“”之前调用。Razor渲染似乎延迟了。

如何强制在result = View(..)调用返回时呈现视图?

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

4

1 回答 1

1

直到操作完成后才会呈现视图。您可以调用 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);
    }

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

于 2013-02-13T05:59:13.633 回答