这个占位符在默认模板中的用途是什么?

时间:2015-05-24 03:08:10

标签: asp.net visual-studio-2013

在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()可能会看一下它的父母,但我找不到任何证据来查看来源。

这种控制是否符合目的?它是什么?

1 个答案:

答案 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 );
}

如果标题中没有动态控件,则占位符可能是多余的。