1

Html.Action在视图中使用以显示启用了 CacheControl 的操作的结果时遇到问题。

代码

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*"]
public class CachedController : Controller
{
    public ViewResult CachedAction()
    {
        var model = GetFromDB();
        return PartialView(model);  
    }
}

在 SomeView.cshtml 文件中,如果我有代码

@Html.Action("CachedAction", "Cached")

我收到一个 Http 500 错误,并且 SomeView.cshtml 的 html 被发送到包含在pre标记中的浏览器,例如:

<!DOCTYPE html>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <pre>
            // HTML for someView.cshtml here
        </pre>
    </body>
</html>

任何人都知道这里的问题是什么?

注意: 如果我删除 OutputCacheAttribute 并且看到正确呈现的视图,代码将按预期工作。

4

4 回答 4

1

目前,您正在整个控制器上设置缓存而不是操作。

尝试移动它,使您的代码变成这样:

public class CachedController : Controller
{
     [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*"]
     public ViewResult CachedAction()
     {
          var model = GetFromDB();
          return PartialView(model);  
     }
}

除非那当然是你的意图,但你的问题并不清楚。

于 2012-12-20T12:16:54.277 回答
1

我解决了我的问题。我使用 OutputCache 属性来指定不应缓存此控制器中的操作的输出,而只有少数操作有此要求,我天真地将其应用于控制器上的所有操作。

我通过从控制器中删除缓存并使用 OutputCache 属性装饰所需的操作来解决此问题。如果 ASP.NET MVC 代码具有缓存的 Html.Action,则它呈现页面的方式也存在问题。我希望部分不会被加载。但是在这个页面中,整个页面都没有加载。

我意识到这个问题很大程度上与上下文有关。我借鉴了很多建议作为这篇文章的评论和答案。我也不希望将我自己的答案标记为已接受。因此,如果你们中的某个人整合了一些调试此问题的技巧并更新了您的答案,我会将其标记为已接受。

于 2012-12-22T04:49:25.130 回答
1

尝试直接在动作上方使用属性,而不是在控制器定义上方。

于 2012-12-20T12:13:34.283 回答
-1

而不是使用

@Html.Action("CachedAction", "Cached")

试试下面

@Html.Partial("CachedAction")
于 2016-03-17T21:11:55.663 回答