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