使用 ASP.NET MVC 时,使用一个 HTML 更新多个页面部分的最佳方法是什么?操作() 方法



我有一个相当大的 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

因此,研究如何组织控制器并根据您的用例建立意见将是我最好的选择,基于我从您的问题中看到和猜测的内容。

希望有帮助...

相关内容

最新更新