2011-09-19 150 views
7

有沒有人在使用asp.net MVC 3中的XSLT方面有經驗?在ASP .NET MVC 3中使用XSLT 3

此處的目的是爲了能夠開發可以在運行時根據某些條件更改樣式和佈局的頁面。例如,用戶配置文件。

一個解決方案是我們可以使用單獨的佈局頁面,並通過設置動態屬性Viewbag在運行時設置它。但是如果我們想在頁面中添加新的佈局,這種方法需要重新編譯。我在想,也許我們可以在運行時在控制器中動態加載XSL,並在運行時將它綁定到模型對象。 HTML內容然後可以在頁面的預定義部分中呈現。

代碼片段將是一個很大的幫助。

+0

你有沒有找到解決方案?你最終做了什麼? – XtremeBytes

回答

16

我剛剛構建了一個將XML轉換爲HTML以在MVC3中顯示的網站。我使用了第二種技術,控制器確定要使用的XML和XSLT文件,並將其傳遞到模型中。視圖中的HTML助手實際上執行轉換。

在這種情況下,我正在渲染一個會議程序,所以這是Program下面提到的。參數可以提供給樣式表;下面,我提供一個基礎URL作爲一個參數,將被轉換成生成的HTML鏈接。

模型:

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>