【发布时间】:2011-01-20 20:10:04
【问题描述】:
我使用的是 ASP.NET MVC2 和 C#,但这个问题一般适用于 ASP.NET。
这会中断:
<body id="<asp:ContentPlaceHolder ID="BodyID' runat="server" />">
Intellisense 在body 标签和紧跟id= 之后的开头引号下划线,并抱怨:
验证 (HTML 4.01):元素 'body' 缺少起始标记中的 '>' 字符。
asp 元素被忽略,渲染的 HTML 中的 id 属性为空。 (无论我在 ASP 元素中使用双引号还是单引号,都会出现同样的问题,但后者会破坏 VS 中的语法高亮显示。)
这可行(假设我设置了会话变量):
<body id="<%: Session["BodyID"] %>">
为什么 HTML 属性内支持内联求值,但 ASP 控件不会在属性内呈现?
这是我的用例:根据从控制器传递的数据,视图知道它正在呈现什么类型的数据。视图将数据注入到母版页的各个位置。我可以在头部注入标题,在正文中注入标记——但我也想将数据注入一些属性。 ID 和类名是明显的例子,但还有其他例子。
我想在保持有效标记的同时做到这一点;没有像动态呈现整个 body 标记这样的技巧——我想要一个在 Visual Studio 中始终看起来像有效 HTML 或 XML 文档的页面。
使用内联 eval 是可以的,但它需要我设置属性,我在模型或控制器中执行此操作。在某些情况下这是必要的,但在其他情况下,值是静态的——我有一个专门构建的视图,我只需将视图中的静态值注入母版页。我不想通过创建抽象控制器类的所有开销,让我的所有控制器都从它继承等等,只是为了获得我在注入标记时已经拥有的相同功能。
附带问题(是的,我应该为此打开一个单独的问题):ASP 控件和内联代码块的评估顺序是什么?我假设代码块在 ASP 控件之前首先被解析,所以我可以例如将代码块放入 ASP 控件声明中。但是我找不到详细说明该过程的文档——谁能给我指出来?
谢谢!
更新: Pauli 提到您确实可以在任何您喜欢的地方使用 ContentPlaceholder,只要它们不在已标记为 runat="server" 的元素内。我再次测试,发现他是正确的——我最初错过了。 Visual Studio 仍然感到困惑并给出 HTML 验证警告,但在呈现页面时,预期值会出现在属性中。所以,这个问题的答案是“但你可以!”
【问题讨论】:
-
一个占位符对于一个属性值来说看起来有点矫枉过正
-
没有我看到的将数据传输到母版页的其他技术那么矫枉过正!参见例如stackoverflow.com/questions/78548/… -- 认为我想做 that 只是为了从视图中获取一个 ID 给主人? ;-)
标签: html asp.net contentplaceholder