2011-09-19 13 views
7

誰もがasp.net MVC 3でXSLTを使用することに経験がありますか?ASP .NET MVC 3でXSLTを使用

ここでの意図は、いくつかの条件に基づいて実行時にスタイリングとレイアウトを変更できるページを開発できるようにすることです。たとえば、ユーザープロファイル。

解決策の1つは、別々のレイアウトページを使用し、実行時に動的プロパティViewbagを設定することです。しかし、この方法では、新しいレイアウトをページに追加したい場合は、再コンパイルが必要になります。私は、実行時にコントローラでXSLを動的にロードし、それを実行時にモデルオブジェクトにバインドすることができると考えていました。 HTMLコンテンツは、ページのあらかじめ定義されたセクションに表示されます。

コードスニペットは大きな助けになります。

+0

あなたはこれに対する解決策を見つけましたか?何をやったの? – XtremeBytes

答えて

16

MVC3で表示するために、XMLをHTMLに変換するサイトを作成しました。私はコントローラが使用するXMLファイルとXSLTファイルを決定し、それらをモデルに渡すという2番目の手法を使用しました。ビュー内のHTMLヘルパーが実際に変換を実行します。

この場合、私は会議プログラムをレンダリングしています。そのため、Programは以下のとおりです。パラメータはスタイルシートに供給できます。以下では、生成されたHTMLのリンクに変換されるパラメータとしてベースURLを提供しています。

モデル:

public class ProgramModel 
{ 
    public string ProgramFilename { get; set; } 
    public string StylesheetFilename { get; set; } 

    public Dictionary<string, string> Parameters { get; protected set; } 

    public ProgramModel() 
    { 
     Parameters = new Dictionary<string, string>(); 
    } 
} 

コントローラ:

[OutputCache(Duration=1000)] 
    public ActionResult Index() 
    { 
     string xmlFile = Server.MapPath("~/Program.xml"); 
     string xsltFile = Server.MapPath("~/Program-index.xslt"); 
     Response.AddCacheDependency(new CacheDependency(xmlFile), new CacheDependency(xsltFile)); 

     ProgramModel model = new ProgramModel(); 
     model.ProgramFilename = xmlFile; 
     model.StylesheetFilename = xsltFile; 
     model.Parameters["baseDayUrl"] = Url.Action("Day"); 

     return View(model); 
    } 

ヘルパー:

public static class HtmlHelperXmlExtensions 
{ 
    /// <summary> 
    /// Applies an XSL transformation to an XML document. 
    /// </summary> 
    public static HtmlString RenderXml(this HtmlHelper helper, string xmlPath, string xsltPath, IDictionary<string,string> parameters) 
    { 
     XsltArgumentList args = new XsltArgumentList(); 
     if (parameters != null) 
      foreach (string key in parameters.Keys) 
       args.AddParam(key, "", parameters[key]); 

     XslCompiledTransform t = new XslCompiledTransform(); 
     t.Load(xsltPath); 

     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.DtdProcessing = DtdProcessing.Parse; 
     settings.ValidationType = ValidationType.DTD; 

     using (XmlReader reader = XmlReader.Create(xmlPath, settings)) 
     { 
      StringWriter writer = new StringWriter(); 
      t.Transform(reader, args, writer); 
      return new HtmlString(writer.ToString()); 
     } 

    } 

} 

ビュー:

<div data-role="content"> 
@Html.RenderXml(Model.ProgramFilename, Model.StylesheetFilename, Model.Parameters) 
</div> 
関連する問題