使用 ASP.NET MVC 时,使用一个 HTML.Action() 方法更新多个页面部分的最佳方法是什么?
When using ASP.NET MVC, what is the best way to update multiple page sections with one HTML.Action() method?
我有一个相当大的 ASP.NET MVC 站点,其中包含 100 个控制器和数千个操作。以前在 Site.Master 页面上定义的 header 图像是硬编码的,我想使其动态化。
为此,我将此行添加到我的 Site.Master 文件中:
<%= Html.Action("GetHeaderTitle", "Home")%>
return header 标题 HTML,例如:
<span style='font-size:15px;'>My Header Title</span>
问题是 <title>
也有相同的硬编码值。我显然可以创建另一个 HTML.Action 来让它在标题中显示动态有效,但现在我要返回服务器两次以获取基本相同的信息(不完全相同)与 HTML 相同,因为我不想要 span 信息,但服务器上获取数据的逻辑相同。
有没有办法让 Html.Action return 多个片段 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
和 return 中。这将允许您批量查询并保存往返行程。并使用注入到您的控制器 class 中的数据存储库(如果您还没有这样做的话)。抱歉,我在这里猜测是因为您没有显示任何控制器代码。
或者您应该利用客户端代码 (JavaScript)
并通过 ajax 加载部分 UI?并让 UI 自行更新(也可以是反应式的)。
不幸的是,我感觉你今天面临的不是title
,而是hundreds of controllers with thousands of actions
。
因此,根据我从你的问题中看到和猜测的内容,研究如何组织控制器并根据你的用例建立意见是我最好的选择。
希望对您有所帮助...
我有一个相当大的 ASP.NET MVC 站点,其中包含 100 个控制器和数千个操作。以前在 Site.Master 页面上定义的 header 图像是硬编码的,我想使其动态化。
为此,我将此行添加到我的 Site.Master 文件中:
<%= Html.Action("GetHeaderTitle", "Home")%>
return header 标题 HTML,例如:
<span style='font-size:15px;'>My Header Title</span>
问题是 <title>
也有相同的硬编码值。我显然可以创建另一个 HTML.Action 来让它在标题中显示动态有效,但现在我要返回服务器两次以获取基本相同的信息(不完全相同)与 HTML 相同,因为我不想要 span 信息,但服务器上获取数据的逻辑相同。
有没有办法让 Html.Action return 多个片段 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
和 return 中。这将允许您批量查询并保存往返行程。并使用注入到您的控制器 class 中的数据存储库(如果您还没有这样做的话)。抱歉,我在这里猜测是因为您没有显示任何控制器代码。
或者您应该利用客户端代码 (JavaScript)
并通过 ajax 加载部分 UI?并让 UI 自行更新(也可以是反应式的)。
不幸的是,我感觉你今天面临的不是title
,而是hundreds of controllers with thousands of actions
。
因此,根据我从你的问题中看到和猜测的内容,研究如何组织控制器并根据你的用例建立意见是我最好的选择。
希望对您有所帮助...