【问题标题】:ASP.NET MVC - View with master page, how to set title?ASP.NET MVC - 使用母版页查看,如何设置标题?
【发布时间】:2008-11-28 20:40:13
【问题描述】:

在使用母版页时,为视图设置 html 标题(在头部)的首选方式是什么?

一种方法是在 .aspx 文件中使用 Page.Title,但这需要在母版页中使用,这可能会与 HTML 代码混淆。所以,让我们假设没有服务器端控件,只有纯 html。有更好的想法吗?

更新:我想在视图中设置标题而不是在控制器或模型中。

【问题讨论】:

    标签: asp.net asp.net-mvc master-pages


    【解决方案1】:

    在我们的母版页中,我们创建了“init”ContentPlaceHolder 和“title”ContentPlaceHolder。如果有人想以编程方式设置 Page.Title,他们可以在 CSharp 中的 init 占位符中设置它,或者他们可以使用标签覆盖“title”占位符。

    母版页

    <asp:ContentPlaceHolder id="init" runat="server"></asp:ContentPlaceHolder>
    <head runat="server">    
        <asp:ContentPlaceHolder ID="title" runat="server">
            <title><%=this.Page.Title%></title>
        </asp:ContentPlaceHolder>
    </head>
    

    查看页面 可以覆盖整个“标题”内容占位符:

    <asp:Content ID="Content1" ContentPlaceHolderID="title" runat="server">
           <title>Home Page</title>
    </asp:Content>
    

    或以编程方式设置页面标题。

    <asp:Content ID="Content1" ContentPlaceHolderID="init" runat="server">
        <%this.Title = "Home Page";%>
    </asp:Content>
    

    确保从顶部的 Page 指令中删除 Title="",否则您将无法以编程方式更改 Page.Title。

    【讨论】:

    • 如果您打算从视图顶部的 Title="" 指令填充标题,则只需要 head 标签中的 runat="server"。否则最好把它排除在外。
    • 这太完美了——我需要一种方法在基于 Web 窗体的旧视图中支持这一点。当然,它已经通过 Razor 支持,其 ViewBag.propertyName 语法可以在声明布局页面之前引导所有 Razor 视图。再次感谢!
    【解决方案2】:

    我看到很多人使用&lt;%= ViewData["Title"] %&gt; 选项。

    我想你也可以插入一个名为 Title 的 ContentPlaceHolder,然后在你的页面上使用它,但是在我见过的所有 MVC 示例中,它们都使用第一个选项。

    【讨论】:

      【解决方案3】:

      当我创建一个新的 MVC 项目时,其中包含文件并使用母版页。看起来它似乎将标题作为 ViewData["Title"] 传递给 ViewData,并且在母版页中,&lt;head&gt; 中有一个输出 ViewData["Title"] 的脚本块。

      【讨论】:

        【解决方案4】:

        我最终使用代码隐藏文件在Page_Load() 方法中实现Page.Title="..."

        我不喜欢这样做,但是尝试直接在 .aspx 页面中实现更改没有奏效,因为它导致出现两个 &lt;title&gt; 标记,一个是我生成的,另一个是由页面继承自的主文件。

        理想情况下,我的页面代码应该覆盖主文件的 &lt;title&gt; 值,但我想这只是 ASP.Net MVC 仍然存在的那些怪癖之一,并且可能已经在较新版本的ASP.Net MVC 框架(我们仍在使用 ASP.Net MVC Beta)

        【讨论】:

          【解决方案5】:

          您可以在母版页中执行此操作:

          <title>
              <%:MyTitle + " :: " %>
              <asp:ContentPlaceHolder ID="TitleContent" runat="server">
              </asp:ContentPlaceHolder>
          </title>
          

          其中 MyTitle = 来自您的 web.config 或硬文本(如“我的网站”)的某个值

          现在在视图页面中(例如索引):

          <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
          <%:"My Home Page"%>
          

          现在,当您浏览主页时,标题将是“My Web :: My Home Page”。

          【讨论】:

          • 嗨,我喜欢这种方法!有用!我对其进行了一些修改,将“::”分隔符从母版页放置到视图页面,这样我们就可以避免在主页上显示一个空的“::”。
          【解决方案6】:

          我有一个从资源文件设置页面标题的基本视图类。对我来说效果很好。

          【讨论】:

            【解决方案7】:

            我用 Title 属性创建了一个名为 Application 的类(使用 get/set):

            public static class Application
            {
                static string title;
            
                public static string Title
                {
                    get { return title; }
                    set { title = value; }
                }
            }
            

            然后我为每个页面设置 Page_Load 事件的属性:

            Application.Title = "Silly Application";
            

            然后我只是在母版页上引用该属性:

            <div id="divApplicationTitle">
                 <asp:HyperLink runat="server" NavigateUrl="~/Default.aspx"><asp:Image ID="imgApplicationImage" runat="server" SkinID="skinApplicationLogo" /><%=Application.Title%></asp:HyperLink> 
            </div> 
            

            【讨论】:

              【解决方案8】:

              @Page 指令有一个 Title 属性,用于内容页面。

              【讨论】:

              • 是的,但我上面说过,它需要在母版页中 ,这不是我想要的。
              • 那么您的问题是无意义的,因为您是说您想使用服务器端构造设置内容页面的标题,但您不想使用服务器端构造。跨度>
              • 好吧,我想避免使用任何 aspx 控件。 吃掉了我们使用的一些 html,我们可以解决,但我宁愿只使用纯 html。不过母版页和控件应该是可以接受的。
              • 如果你使用的是 MVC……你真的不应该依赖“runat=server”的东西。否则,你为什么要使用 MVC :)
              • 因为 MVC 是一种设计模式,与整个“纯粹主义”write-it-all-in-the-aspx-page 论点几乎没有关系。
              【解决方案9】:

              对于 ASP.NET 内容页面,只需在 &lt;%@ %&gt; 占位符中添加 Title=""

              【讨论】:

                【解决方案10】:

                我们最终得到了

                <head runat=server visible=false>
                

                在母版页中。

                这样我们可以从 Page.Title 中读取(Page.Title 需要 head 元素存在,否则会抛出异常,用反射器检查)。然后我们使用我们自己的 head 元素 - MVC 方式。

                【讨论】:

                  【解决方案11】:

                  您始终可以在视图页面中使用 javascript:

                  <script type="text/javascript>
                      document.title = "Hello World";
                  </script>
                  

                  【讨论】:

                  • 不要这样做,因为 JavaScript 从来都不是 100% 给定的。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-06-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多