在Visual Studio 2013 Update 4中生成新的默认WebForms应用程序时,您将在head部分中获得以下内容:
<head runat="server">
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title><%: Page.Title %> - My ASP.NET Application</title>
<asp:PlaceHolder runat="server">
<%: Scripts.Render("~/bundles/modernizr") %>
</asp:PlaceHolder>
<webopt:bundlereference runat="server" path="~/Content/css" />
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
</head>
任何人都可以解释这个相当奇怪的PlaceHolder控件的目的吗?它显然不存在,因此您可以在运行时实际替换内容,因为没有与之关联的ID。并且它似乎没有帮助修复捆绑包,因为捆绑包在没有PlaceHolder的情况下渲染得很好。
我无法理解为什么ASP.NET团队认为这个PlaceHolder控件应该在那里,并且没有任何目的。这仅仅是一个错误吗?它是否打算拥有一个ID,以便在运行时更换?或者我在这里缺少什么?
我唯一能想到的是Scripts.Render()
可能会看一下它的父母,但我找不到任何证据来查看来源。
这种控制是否符合目的?它是什么?
答案 0 :(得分:2)
避免了这个错误:
由于控件无法修改Controls集合 包含代码块(即&lt;%...%&gt;)。
通过在运行时向head
元素添加控件(例如动态元标记),可以很容易地生成此错误。
protected override void OnInit( EventArgs e )
{
// will throw without placeholder
Header.Controls.Add( new HtmlGenericControl( "meta" ) );
base.OnInit( e );
}
如果标题中没有动态控件,则占位符可能是多余的。