私は 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 コントロールが属性内でレンダリングされないのはなぜですか?
これが私の使用例です。コントローラーから渡されたデータに基づいて、ビューはレンダリングしているデータのタイプを認識します。ビューは、マスター ページのさまざまな場所にデータを挿入します。タイトルを head に挿入し、マークアップを body に挿入できますが、一部の属性にデータを挿入したい場合もあります。ID とクラス名は明らかな例ですが、他にもあります。
有効なマークアップを維持しながらこれを行いたいです。body タグ全体を動的にレンダリングするようなトリックはありません。Visual Studio で常に有効な HTML または XML ドキュメントのように見えるページが必要です。
インライン eval の使用は問題ありませんが、プロパティを設定する必要があり、モデルまたはコントローラーで行います。必要な場合もあれば、値が静的である場合もあります。専用のビューがあり、ビューからマスター ページに静的な値を挿入するだけで済みます。マークアップを挿入するときに既に持っているのと同じ機能を取得するためだけに、抽象コントローラー クラスを作成したり、すべてのコントローラーを継承したりするなどのオーバーヘッドをすべて処理したくありません。
副次的な質問 (はい、別の質問を開く必要があります): ASP コントロールとインライン コード ナゲットの評価の順序は何ですか? コード ナゲットは、ASP コントロールの前に最初に解決されると想定しているため、たとえば、ASP コントロール宣言内にコード ナゲットを配置することができます。しかし、プロセスを詳しく説明しているドキュメントが見つかりません。誰か教えてもらえますか?
ありがとう!
更新:パウリは、 ContentPlaceholders は、すでにマークされている要素内にない限り、好きな場所で実際に使用できると述べましたrunat="server"
。もう一度テストしたところ、彼が正しいことがわかりました。最初はそれを見逃していました。Visual Studio は依然として混乱しており、HTML 検証の警告が表示されますが、ページがレンダリングされると、期待される値が属性に表示されます。したがって、質問に対する答えは「でもできます」です。