【问题标题】:When using ASP.NET MVC, what is the best way to update multiple page sections with one HTML.Action() method?使用 asp.net-mvc 时,使用一个 HTML.Action() 方法更新多个页面部分的最佳方法是什么
【发布时间】:2016-03-05 13:10:43
【问题描述】:

我有一个相当大的 asp.net-mvc 站点,其中包含 100 个控制器和数千个操作。以前在 Site.Master 页面上定义的标题图像是硬编码的,我想让它动态化。

为此,我将此行添加到我的 Site.Master 文件中:

  <%= Html.Action("GetHeaderTitle", "Home")%>

它只是返回一些 HTML 的标题标题,例如:

 <span style='font-size:15px;'>My Header Title</span>

问题是&lt;title&gt; 也有同样的硬编码值。我显然可以创建另一个 HTML.Action 让它在标题中显示动态有效,但现在我要返回服务器两次以获得基本相同的信息(不是完全相同的 HTML,因为我不想要跨度信息但是服务器上获取数据的相同逻辑)。

有什么方法可以让 Html.Action 返回多个 html 的 sn-ps,我可以在母版页的不同位置进行更新。

【问题讨论】:

    标签: asp.net-mvc performance html.actionlink master-pages


    【解决方案1】:

    我认为你看错了 - 如果检索标题是一个很长的操作,那么只需缓存结果并编写不同的操作。

    // 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 %>
    

    【讨论】:

      【解决方案2】:

      您是否在您的 site.master 中使用&lt;asp:ContentPlaceHolder ID="TitleContent" runat="server" /&gt; ??或者你考虑过使用它吗?这将允许您根据模型在视图中设置标题。

      也许您还应该考虑引入ViewModels,它允许您将视图相关数据组合成ViewModel,并从控制器返回。这将允许您批量查询并节省往返行程。并使用注入到您的控制器类中的数据存储库(如果您还没有这样做)。抱歉,我在这里猜测是因为您没有显示任何控制器代码。

      或者您应该利用客户端代码(JavaScript) 并通过ajax 加载部分UI?并让 UI 自行更新(也可以是响应式的)。

      不幸的是,我觉得你今天面临的事情不是关于title,而是更多关于hundreds of controllers with thousands of actions

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

      希望对您有所帮助...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        相关资源
        最近更新 更多