2011-09-19 25 views
7

¿Alguien tiene experiencia en el uso de XSLT en asp.net MVC 3?El uso de XSLT en ASP .NET MVC 3

La intención aquí es ser capaz de desarrollar páginas externas sobre el estilo y el diseño se puede cambiar en tiempo de ejecución basado en algunas condiciones. por ejemplo, perfil de usuario.

Una solución es que podemos usar las páginas de diseño independientes y establecer que en tiempo de ejecución mediante el establecimiento de la propiedad dinámica Viewbag. Pero este enfoque requeriría una recompilación si queremos agregar un nuevo diseño a la página. Estaba pensando que podríamos cargar un XSL dinámicamente en el controlador en tiempo de ejecución y vincularlo al objeto modelo en tiempo de ejecución. El contenido HTML se puede representar en una sección predefinida en la página.

Un fragmento de código sería una gran ayuda.

+0

¿Has encontrado una solución para esto? ¿Qué terminaste haciendo? – XtremeBytes

Respuesta

16

Acabo de construir un sitio que transforma XML en HTML para su visualización en MVC3. Usé la segunda técnica, donde el controlador determina los archivos XML y XSLT a usar, y los pasa en el modelo. Un ayudante de HTML en la vista realmente realiza la transformación.

En este caso estoy haciendo un programa de conferencias, así que eso es lo que se refiere a Program a continuación. Los parámetros se pueden suministrar a la hoja de estilo; a continuación, estoy suministrando una URL base como parámetro que se convertirá en enlaces en el HTML generado.

El modelo:

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

El controlador:

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

El ayudante:

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

    } 

} 

La vista:

<div data-role="content"> 
@Html.RenderXml(Model.ProgramFilename, Model.StylesheetFilename, Model.Parameters) 
</div> 
Cuestiones relacionadas