我正在使用ASP.NET MVC2和C#,但这个问题一般适用于ASP.NET。
这打破了:
<body id="<asp:ContentPlaceHolder ID="BodyID' runat="server" />">
Intellisense会在body
之后立即强调id=
标记和开头引号,并抱怨:
验证(HTML 4.01):元素'body'缺少'&gt;'从开始标记开始的字符。
忽略asp元素,并且在呈现的HTML中id属性为空。 (同样的问题是我在ASP元素中使用双引号还是单引号,后者在VS中破坏了语法hilighting。)
这有效(假设我设置了会话变量):
<body id="<%: Session["BodyID"] %>">
为什么HTML属性内部支持内联评估,但ASP控件不会在内部属性中呈现?
这是我的用例:基于从控制器传递的数据,视图知道它呈现的数据类型。视图将数据注入母版页中的各个位置。我可以在脑袋中注入一个标题,然后将标记注入体内 - 但我也想将数据注入到某些属性中。 ID和类名是明显的例子,但还有其他例子。
我想在保持有效标记的同时这样做;没有动态渲染整个body标签的技巧 - 我想在Visual Studio中随时看到一个看起来像有效的HTML或XML文档的页面。
使用内联eval是可以的,但它需要我设置属性,我在模型或控制器中执行。在某些情况下这是必要的,但在其他情况下,值是静态的 - 我有一个专门构建的视图,我只需要将视图中的静态值注入到母版页中。我不想通过创建一个抽象控制器类的所有开销,让我的所有控制器继承它,等等,以获得我在注入标记时已经拥有的相同功能。
附带问题(是的,我应该为它打开一个单独的问题):ASP控件和内联代码块的评估顺序是什么?我假设在ASP控制之前首先解析代码块,所以我可以例如在ASP控件声明中放入一个代码块。但我找不到详细说明这个过程的文档 - 有人能指出它们吗?
谢谢!
更新: Pauli提到您确实可以在任何您喜欢的地方使用ContentPlaceholders,只要它们不在已标记为runat="server"
的元素中。我再次测试,看他是对的 - 我最初错过了。 Visual Studio仍然混淆并提供HTML验证警告,但在呈现页面时,预期值将显示在属性中。所以,问题的答案是“但你可以!”
答案 0 :(得分:2)
由于body标签没有runat =“server”,因此它不被视为服务器控件,而只是清除文本,因此可以放置内容占位符或任何其他控件。