2011-09-19 13 views
7

Czy ktoś ma doświadczenie w korzystaniu z XSLT w asp.net MVC 3?Korzystanie z XSLT w ASP .NET MVC 3

Chodzi o to, aby móc tworzyć strony, których styl i układ można zmienić w czasie wykonywania na podstawie pewnych warunków. na przykład profil użytkownika.

Jednym z rozwiązań jest to, że możemy korzystać z oddzielnych stron układu i ustawiać je w czasie wykonywania, ustawiając właściwość Dynamic Viewbag. Ale to podejście wymagałoby przekompilowania, jeśli chcemy dodać nowy układ strony. Pomyślałem, że możemy załadować dynamicznie XSL w kontrolerze w czasie wykonywania i powiązać go z obiektem modelu w czasie wykonywania. Zawartość HTML może być następnie renderowana w predefiniowanej sekcji na stronie.

Fragment kodu byłby bardzo pomocny.

+0

Czy znalazłeś rozwiązanie tego problemu? Co robiłeś w końcu? – XtremeBytes

Odpowiedz

16

Właśnie zbudowałem witrynę, która przekształca XML w HTML do wyświetlania w MVC3. Użyłem drugiej techniki, w której kontroler określa pliki XML i XSLT do użycia i przekazuje je w modelu. Pomocnik HTML w widoku faktycznie wykonuje transformację.

W tym przypadku wykonuję program konferencyjny, a więc poniżej podano, co to jest Program. Parametry mogą być dostarczane do arkusza stylów; poniżej dostarczam podstawowy adres URL jako parametr, który zostanie przekształcony w odnośniki w wygenerowanym kodzie HTML.

Model:

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>(); 
    } 
} 

Kontroler:

[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); 
    } 

Pomocnik:

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()); 
     } 

    } 

} 

Widok:

<div data-role="content"> 
@Html.RenderXml(Model.ProgramFilename, Model.StylesheetFilename, Model.Parameters) 
</div> 
Powiązane problemy