【问题标题】:Why can't I use a ContentPlaceholder inside HTML attributes in ASP.NET?为什么我不能在 ASP.NET 的 HTML 属性中使用 ContentPlaceholder?
【发布时间】: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


【解决方案1】:
  1. 不应将 WebForms 控件与 MVC 一起使用
  2. 在您的 ID 和 runat 周围使用 '',因为解析器会混淆所有冲突的 "'

由于 body 标记没有 runat="server" 它不被视为服务器控件,而只是明文,因此您可以将 contentplaceholder 或任何其他控件放在您想要的任何位置。

【讨论】:

  • ContentPlaceHolders 在 MVC 中非常好。它们位于 MVC 附带的示例项目中。
  • 我说你不​​应该...使用 等也很好,但我建议在 MVC 中呈现内容时坚持使用 HtmlHelpers。
  • 是的,但是 HTMLHelper 在这里帮不了我——它是需要数据的母版页,但助手会在视图上。不管我如何生成内容,我只能通过以下两种方式之一将其注入到主页面中:ContentPlaceholder,或调用函数或属性的内联 eval。
  • Pauli,在另一个答案中,您指出将控件放在属性中确实可以工作,我现在认为这是正确的。如果您为此创建一个单独的答案,我会接受它。
猜你喜欢
  • 2017-10-19
  • 2022-01-16
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多