我认为他们的措辞有点令人困惑。您是正确的,指令中的值本质上是属性。事实上,您可以在对象模型中设置大部分这些 AS 属性(例如,在代码隐藏中)。
protected override void OnInit( EventArgs e )
{
this.EnableViewState = true;
this.MasterPageFile = "~/something.master";
this.Title = "Hello World";
}
它们还有几个重要的指令Page
,例如Import
和Control
。我建议也熟悉这些。
编辑:我很好奇这些属性在从 Page 指令设置时会在哪里结束,所以我查看了 ASP.Net 缓存。您可能知道,当一个页面被执行时,它会变成一个对象并缓存在文件系统中:
c:\windows\Microsoft.Net\Framework[版本]\Temporary ASP.Net Files\
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
private void @__BuildControlTree(content_shared_toolbarcontrol_ascx @__ctrl) {
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
#line 1 "C:\dev\Web.UI\Content\Shared\ToolbarControl.ascx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n<div class=\"toolbar\">\r\n "));
#line default
#line hidden
global::System.Web.UI.HtmlControls.HtmlGenericControl @__ctrl1;
#line 1 "C:\dev\Web.UI\Content\Shared\ToolbarControl.ascx"
@__ctrl1 = this.@__BuildControldivDelete();
#line default
#line hidden
#line 1 "C:\dev\Web.UI\Content\Shared\ToolbarControl.ascx"
@__parser.AddParsedSubObject(@__ctrl1);
#line default
#line hidden
#line 1 "C:\dev\Web.UI\Content\Shared\ToolbarControl.ascx"
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n <div class=\"toolbarSpacer\"></div>\r\n <div class=\"toolbarButton\">"));
et cetera
我发现有趣的是,这些自动生成的文件中不包含诸如可能在 Page 指令中设置的属性。这使我相信指令的完整性是在每个请求上处理的,而不是与页面一起编译的。
编辑#2:根据下面 BurningIce 的评论,我对此进行了进一步的研究。我相信指令属性可以描述如下。
指令中的每个属性都用于以下一个或多个目的:编译器提示(例如代码隐藏路径)、加载页面的提示(例如页面继承自哪个类)、渲染提示页面(例如 MasterPageFile)和/或要在创建的每个页面实例上设置的属性(例如 Title)。