2009-05-06 8 views
2

ASP.NET MVC用のビューエンジンとfor-in-oneの "タグスープ"に対するいくつかの批判は、ループとそのようなもの。ASP.NET MVC:XMLにLINQを使用して(X)HTMLをレンダリングする

代替または補完は、HTMLインジケータを使用することでした。これはインラインメソッドコールです。

今日、私はASP.NET MVCのHTMLヘルパーを見ると、TagBuilderというクラスを使用しています。

私の提案はXMLに使用LINQ強く型付けされたと正しくフォーマット取得するために(X)HTMLにある:どこが新しいのできることは、Webフォームで強く型付けされたコントロールと同様ですので、

XDocument output = new XDocument(); 
XElement root = new XElement("div", 
    new XAttribute("class", "root_item")); 

XElement iconImage = new XElement("img", 
    new XAttribute("src", ResolveUrl("~/image.gif")), 
    new XAttribute("alt", "This is an image")); 

XElement link = new XElement("a", 
    new XAttribute("class", "link"), 
    new XAttribute("href", "http://google.com"), 
    new XText("Link to Google")); 


root.Add(link); 
root.Add(iconImage); 
output.Add(root); 

私はそれが好きボタンを押して、別のコントロールのControlコレクションに追加します。

これに明らかな問題や制限はありますか?

+0

私は個人的にはTagBuilderのファンではなく、実際にはstring.Format()以外にも自分自身を構築するためにほとんどの場合に頼っています。あなたの方法論が好きですが、なぜTagBuilderを使いたいのですか?あなたはTagBuilderで同じことをすることができます。 –

答えて

1

上記の方法には2つの問題があります。 まず、

あなたは上記の書いたものを参照する
XElement iconImage = new XElement("img", 
new XAttribute("src", ResolveUrl("~/image.gif")), 
new XAttribute("alt", "This is an image")); 

は、我々のようなものが持つことができます。これは個人的な判断や何であるかもしれないが、私は確かに読み、後でもう一つの「人間」を投票

<img src=<%=whatever%> alt=<%=whatever%> /> 

を。 LINQ 2のXMLを使用すると、私のaspxページ内をさまよっている奇妙なものを取り除くかもしれませんが、同時にそれらの "良い男の子"を不器用に見せます。

パフォーマンス上の問題が発生することがあります。私は解析とLINQ 2のXMLを実行するとかなり遅くなる可能性がありますが、私はこれに関するデータがないと思う。

私はまだMVCフレームワークを試していますが、ASP/PHP-3.Xのような昔のようなところに戻っているような気がします。ほとんどのインタラクティブな部分がウィンドウ/ GUI-OOP指向のASPドットネットフレームワーク。 MVCを使用する主な理由は、クライアント側の最高のHTMLコードを保証できるということです。

+0

私の経験では、XML構築のLinqはすばらしく高速です - それは決してあなたのボトルネックにはなりません。一般に、文字列の操作は非常に高価です(シリアル化されたツリー上で文字列を操作するよりも直接オブジェクトを使用してxmlツリーを構築する方が安いことがあります)その名前と同じ文字列参照を共有します)。 'コースでは、ASP.NETはビューをコンパイルするので、実行時解析+文字列フォーマットも避けられます。 –

3

これは素晴らしいアイデアです!私がそれで見る唯一の問題は、C#の使用です。 ;)VB.NETは、XMLリテラル機能を使用してXMLを生成するためのより優れたサポートを備えています。

質問に記載されたコードは、VB.NETで次のように記述することができます。 (テキストの追加により、あなたの例では、a要素内の任意のテキストが含まれていなかったよう「これはリンクである」。)があり<%= ... %>タグはまだですが、彼らがで妥当性が確認され

Dim root = <div class="root_item"> 
       <img src=<%= ResolveUrl("~/image.gif") %> alt="This is an image"/> 
       <a class="link" href="http://google.com">This is a link</a> 
      </div> 

コンパイル時。このコードがXElement型を返す関数の戻り値になった場合、そのXhtmlスニペットはサイト内の他の場所で再利用できます。

私はVB.NET XMLリテラルをカスタムASP.NET MVCビューエンジンとして使用するCodePlexに関するプロジェクトをhttp://vbmvc.codeplex.comに持っています。これは、MicrosoftのASP.NET製品部門マネージャーであるDmitry Robsmanのコードに基づいています。ビューはVB.NETクラスで、マスターページは基本クラスです。new-up名前の文字列で参照するのではなく、部分的なビュークラスであるため、追加のコンパイル時のチェックとなります。文字列を返すHtmlHelperクラスの代わりに、XElementを返すXhtmlHelperクラスがあり、あなたが提案したものと同様に動作します。

+0

コードノードにテキストノードを追加しました。念押し有難う。 –

関連する問題