在视图中使用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并且我看到正确呈现视图,代码将按预期工作。
答案 0 :(得分:1)
尝试直接在动作上方使用属性,而不是在控制器定义之上。
答案 1 :(得分:1)
目前,您在整个控制器上设置缓存而不是操作。
尝试移动它,以便您的代码成为:
public class CachedController : Controller
{
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*"]
public ViewResult CachedAction()
{
var model = GetFromDB();
return PartialView(model);
}
}
除非你的意图当然,但你的问题并不清楚。
答案 2 :(得分:1)
我解决了我的问题。我正在使用OutputCache属性来指定不应为此控制器中的操作缓存输出,而只有少数操作具有此要求,我天真地将其应用于控制器上的所有操作。
我通过从控制器中删除Cache并使用OutputCache属性修饰所需的操作来修复此问题。 ASP.NET MVC代码呈现页面的方式也存在问题,如果它具有缓存的Html.Action。我希望部分不会被加载。但在此页面中,未加载整个页面。
我意识到这个问题主要是语境问题。我在这篇文章中借鉴了很多建议作为评论和答案。我也不希望将自己的答案标记为已被接受。因此,如果你们中的一个人整合了一些关于调试这个问题并更新你的答案的技巧,那么就把它标记为已接受。
答案 3 :(得分:-1)
而不是使用
@Html.Action("CachedAction", "Cached")
尝试以下
@Html.Partial("CachedAction")