为什么在ASP.NET MVC中,是否有ContentPlaceHolder用于标题?

时间:2009-06-29 18:30:33

标签: asp.net-mvc

在新的ASP.NET站点中,标题为ContentPlaceHolder:

<head runat="server">
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
</head>

在页面中:

<asp:Content ID="aboutTitle" ContentPlaceHolderID="TitleContent" runat="server">
    About Us
</asp:Content>

这是为什么?为什么不能在页面指令上使用title属性/属性?

<%@ Page Title="About Us" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

两种方法都有相同的结果。对我来说,ContentPlaceHolder方法似乎 hackish

如果你需要一个动态标题,你可以在aspx页面中这样做:

<%= this.Title = "About Me" %>

4 个答案:

答案 0 :(得分:3)

请参阅此post

答案 1 :(得分:2)

如果您使用了@Page指令的Title属性,则必须在每个视图中设置应用程序范围的标题,重复代码并违反单一责任原则。

答案 2 :(得分:1)

一种可能的解释(虽然这与您的简单示例无关) - 当您的<head>元素中有脚本内容时,您无法添加runat =“server”或通过{{1}访问它}。例如(对不起,这是我的头脑):

Page.Head

在该示例中,使用ContentPlaceHolder将是一种无法以编程方式访问头部的方法。当然,您可能也可以使用<head> <script type="text/javascript" src="<%= ResolveClientUrl("~/Scripts/script.js") %>"></script> </head> ,这取决于您的偏好(个人而言,我会有点撕裂)。

答案 3 :(得分:0)

您不应该将您的视图视为在MVC中以编程方式与之交互的巨大对象,它们应该是用于生成html的轻量级模板。

如果您将自己的观点视为模板而不是对象,那么使用<ContentPlaceHolder />使用runat="server"

可能会少得多