我有一个相当大的 ASP.NET MVC站点,有100个控制器和数千个操作。 以前,在 Site.Master 页上定义的页眉图像是硬编码的,我希望使其动态化。
为此,我将以下行添加到我的 Site.Master 文件中:
<%= Html.Action("GetHeaderTitle", "Home")%>
它只为标题返回一些 HTML,例如:
<span style='font-size:15px;'>My Header Title</span>
问题是<title>
也具有相同的硬编码值。 我显然可以创建另一个 HTML。让它在标题中显示动态有效的操作,但现在我要返回服务器两次以获取基本相同的信息(不是完全相同的 HTML,因为我不想要跨度信息,而是服务器上的相同逻辑来获取数据)。
有没有办法让 Html.Action 返回多个 HTML 片段,我可以在母版页上的不同位置更新这些片段?
我认为你看错了 - 如果检索标题是一个很长的操作,那么只需缓存结果并编写不同的操作。
// Controller
public string GetTitle()
{
var title = (string)ControllerContext.HttpContext.Items["CachedTitle"];
if (string.IsNullOrEmpty(title))
{
title = "some lengthy retrieval";
ControllerContext.HttpContext.Items["CachedTitle"] = title;
}
return title;
}
public ActionResult GetTitleForTitle()
{
return Content(GetTitle());
}
public ActionResult GetHeaderTitle()
{
return Content("<span>"+ GetTitle() + "<span>");
}
或者,您可以直接将其缓存在视图上,这是一种邪恶(视图越简单越好):
<%
ViewBag.CachedTitle = Html.Action("GetHeaderTitle", "Home");
%>
...
<%= ViewBag.CachedTitle %>
...
<%= ViewBag.CachedTitle %>
您是否在 site.master 中使用<asp:ContentPlaceHolder ID="TitleContent" runat="server" /> ?
?或者你考虑过使用它吗?这将允许您根据模型从视图中设置标题。
也许您还应该考虑引入 ViewModels
,它允许您将视图相关数据合并到ViewModel
中并从控制器返回。这将允许您批量查询并保存往返行程。并使用注入到控制器类中的数据存储库(如果您还没有这样做)。抱歉,我在这里猜测,因为您没有显示任何控制器代码。
或者你应该利用客户端代码(JavaScript)
并通过ajax加载部分UI?并让 UI 更新本身(也可以是反应性的)。
不幸的是,我有一种感觉,你今天面临的不是关于title
,而是关于hundreds of controllers with thousands of actions
。
因此,研究如何组织控制器并根据您的用例建立意见将是我最好的选择,基于我从您的问题中看到和猜测的内容。
希望有帮助...