⬆️ ⬇️

Using XSLT Template Engine in ASP.NET MVC

Now during the development of a widely used pattern of MVC, implying the separation of the data model, presentation and logic of work. A fairly well-known implementation of this pattern in web development is the ASP.NET MVC Framework. Not long ago, the third version of this framework was released, in which there are two options for implementing views: ASPX and Razor. Both engines have a fairly wide range of capabilities, but in this publication I will try to describe the use of another tool for implementing views - XSLT templates.



An XSLT template is an XML document that describes the conversion of one or more input XML documents to output, which is usually also an XML or HTML document. In our case, the input data for the template will be an XML representation of the data obtained from the corresponding models. The data transferred to the template is used to form the page content.

The main project we will serve template ASP.NET MVC 3 Application. Selectable View Engine here does not matter.



Data models



For all models passed to the views, we describe the following base class:



[ Serializable ]

[XmlInclude( typeof (UserModel))]

public abstract class XmlModel { }




The first attribute is needed because the objects of this class will be serialized to XML. The reasons for using the second attribute will be discussed below.

UserModel is an example of a child class that we will pass to the view:

')

[ Serializable ]

public class UserModel : XmlModel

{

[ XmlAttribute ]

public int UserId { get ; set ; }



public string Login { get ; set ; }

public string Email { get ; set ; }

}




Now we describe the main class that will be serialized and passed to the template:



[ Serializable ]

public class Result

{

[ XmlAttribute ]

public string Controller { get ; set ; }

[ XmlAttribute ]

public string Action { get ; set ; }



public List Data { get ; set ; }

}





, , .

Data XmlModel, , XmlInclude XmlModel.

XML- :



< Result Controller ="SomeController" Action ="SomeAction" >

< Data >

<!-- -->

</ Data >

</ Result >






ActionResult. , . c XML-, :



private string _data;

public XmlResult( string data)

{

_data = data;

}




, - ExecuteResult. . :



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}





:



public class XmlResult : ActionResult

{

private string _data;



public XmlResult( string data)

{

_data = data;

}



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}

}





.

ViewData, :



public new List ViewData = new List ();



View, ActionResult . :



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}




:



public abstract class XsltController : Controller

{

public new List ViewData = new List ();



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}

}



:



public class HomeController : XsltController

{

public ActionResult Index()

{

var user = new UserModel { UserId = 1, Login = "root" , Email = "noreply@localhost" };

ViewData.Add(user);

return View();

}

}




. XML:



<? xml version ="1.0" encoding ="utf-16" ? >

< Result xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" Controller ="Home" Action ="Index" >

< Data >

< XmlModel xsi:type ="UserModel" UserId ="1" >

< Login > root </ Login >

< Email > noreply@localhost </ Email >

</ XmlModel >

</ Data >

</ Result >






XSLT-, :



<? xml version ="1.0" encoding ="utf-8" ? >

< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< xsl:output encoding ="utf-8"

method ="xml"

media-type ="application/xhtml+xml"

doctype-public ="-//W3C//DTD XHTML 1.1//EN"

doctype-system ="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />

< xsl:template match ="/" >

< html xmlns ="http://www.w3.org/1999/xhtml" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: < xsl:value-of select ="/Result/@Controller" /></ p >

< p > Action: < xsl:value-of select ="/Result/@Action" /></ p >

< p > User: < xsl:value-of select ="//XmlModel[@xsi:type = 'UserModel']/Login" /></ p >

</ body >

</ html >

</ xsl:template >

</ xsl:stylesheet >




HTML-:



<? xml version ="1.0" encoding ="utf-8" ? >

< html xmlns ="http://www.w3.org/1999/xhtml" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: Home </ p >

< p > Action: Index </ p >

< p > User: root </ p >

</ body >

</ html >




, , , . Controller Action , .



* This source code was highlighted with Source Code Highlighter .

[ Serializable ]

public class Result

{

[ XmlAttribute ]

public string Controller { get ; set ; }

[ XmlAttribute ]

public string Action { get ; set ; }



public List Data { get ; set ; }

}





, , .

Data XmlModel, , XmlInclude XmlModel.

XML- :



< Result Controller ="SomeController" Action ="SomeAction" >

< Data >

<!-- -->

</ Data >

</ Result >






ActionResult. , . c XML-, :



private string _data;

public XmlResult( string data)

{

_data = data;

}




, - ExecuteResult. . :



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}





:



public class XmlResult : ActionResult

{

private string _data;



public XmlResult( string data)

{

_data = data;

}



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}

}





.

ViewData, :



public new List ViewData = new List ();



View, ActionResult . :



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}




:



public abstract class XsltController : Controller

{

public new List ViewData = new List ();



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}

}



:



public class HomeController : XsltController

{

public ActionResult Index()

{

var user = new UserModel { UserId = 1, Login = "root" , Email = "noreply@localhost" };

ViewData.Add(user);

return View();

}

}




. XML:



<? xml version ="1.0" encoding ="utf-16" ? >

< Result xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" Controller ="Home" Action ="Index" >

< Data >

< XmlModel xsi:type ="UserModel" UserId ="1" >

< Login > root </ Login >

< Email > noreply@localhost </ Email >

</ XmlModel >

</ Data >

</ Result >






XSLT-, :



<? xml version ="1.0" encoding ="utf-8" ? >

< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< xsl:output encoding ="utf-8"

method ="xml"

media-type ="application/xhtml+xml"

doctype-public ="-//W3C//DTD XHTML 1.1//EN"

doctype-system ="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />

< xsl:template match ="/" >

< html xmlns ="http://www.w3.org/1999/xhtml" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: < xsl:value-of select ="/Result/@Controller" /></ p >

< p > Action: < xsl:value-of select ="/Result/@Action" /></ p >

< p > User: < xsl:value-of select ="//XmlModel[@xsi:type = 'UserModel']/Login" /></ p >

</ body >

</ html >

</ xsl:template >

</ xsl:stylesheet >




HTML-:



<? xml version ="1.0" encoding ="utf-8" ? >

< html xmlns ="http://www.w3.org/1999/xhtml" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: Home </ p >

< p > Action: Index </ p >

< p > User: root </ p >

</ body >

</ html >




, , , . Controller Action , .



* This source code was highlighted with Source Code Highlighter .

[ Serializable ]

public class Result

{

[ XmlAttribute ]

public string Controller { get ; set ; }

[ XmlAttribute ]

public string Action { get ; set ; }



public List Data { get ; set ; }

}





, , .

Data XmlModel, , XmlInclude XmlModel.

XML- :



< Result Controller ="SomeController" Action ="SomeAction" >

< Data >

<!-- -->

</ Data >

</ Result >






ActionResult. , . c XML-, :



private string _data;

public XmlResult( string data)

{

_data = data;

}




, - ExecuteResult. . :



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}





:



public class XmlResult : ActionResult

{

private string _data;



public XmlResult( string data)

{

_data = data;

}



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}

}





.

ViewData, :



public new List ViewData = new List ();



View, ActionResult . :



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}




:



public abstract class XsltController : Controller

{

public new List ViewData = new List ();



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}

}



:



public class HomeController : XsltController

{

public ActionResult Index()

{

var user = new UserModel { UserId = 1, Login = "root" , Email = "noreply@localhost" };

ViewData.Add(user);

return View();

}

}




. XML:



<? xml version ="1.0" encoding ="utf-16" ? >

< Result xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" Controller ="Home" Action ="Index" >

< Data >

< XmlModel xsi:type ="UserModel" UserId ="1" >

< Login > root </ Login >

< Email > noreply@localhost </ Email >

</ XmlModel >

</ Data >

</ Result >






XSLT-, :



<? xml version ="1.0" encoding ="utf-8" ? >

< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< xsl:output encoding ="utf-8"

method ="xml"

media-type ="application/xhtml+xml"

doctype-public ="-//W3C//DTD XHTML 1.1//EN"

doctype-system ="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />

< xsl:template match ="/" >

< html xmlns ="http://www.w3.org/1999/xhtml" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: < xsl:value-of select ="/Result/@Controller" /></ p >

< p > Action: < xsl:value-of select ="/Result/@Action" /></ p >

< p > User: < xsl:value-of select ="//XmlModel[@xsi:type = 'UserModel']/Login" /></ p >

</ body >

</ html >

</ xsl:template >

</ xsl:stylesheet >




HTML-:



<? xml version ="1.0" encoding ="utf-8" ? >

< html xmlns ="http://www.w3.org/1999/xhtml" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: Home </ p >

< p > Action: Index </ p >

< p > User: root </ p >

</ body >

</ html >




, , , . Controller Action , .



* This source code was highlighted with Source Code Highlighter .

[ Serializable ]

public class Result

{

[ XmlAttribute ]

public string Controller { get ; set ; }

[ XmlAttribute ]

public string Action { get ; set ; }



public List Data { get ; set ; }

}





, , .

Data XmlModel, , XmlInclude XmlModel.

XML- :



< Result Controller ="SomeController" Action ="SomeAction" >

< Data >

<!-- -->

</ Data >

</ Result >






ActionResult. , . c XML-, :



private string _data;

public XmlResult( string data)

{

_data = data;

}




, - ExecuteResult. . :



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}





:



public class XmlResult : ActionResult

{

private string _data;



public XmlResult( string data)

{

_data = data;

}



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}

}





.

ViewData, :



public new List ViewData = new List ();



View, ActionResult . :



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}




:



public abstract class XsltController : Controller

{

public new List ViewData = new List ();



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}

}



:



public class HomeController : XsltController

{

public ActionResult Index()

{

var user = new UserModel { UserId = 1, Login = "root" , Email = "noreply@localhost" };

ViewData.Add(user);

return View();

}

}




. XML:



<? xml version ="1.0" encoding ="utf-16" ? >

< Result xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" Controller ="Home" Action ="Index" >

< Data >

< XmlModel xsi:type ="UserModel" UserId ="1" >

< Login > root </ Login >

< Email > noreply@localhost </ Email >

</ XmlModel >

</ Data >

</ Result >






XSLT-, :



<? xml version ="1.0" encoding ="utf-8" ? >

< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< xsl:output encoding ="utf-8"

method ="xml"

media-type ="application/xhtml+xml"

doctype-public ="-//W3C//DTD XHTML 1.1//EN"

doctype-system ="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />

< xsl:template match ="/" >

< html xmlns ="http://www.w3.org/1999/xhtml" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: < xsl:value-of select ="/Result/@Controller" /></ p >

< p > Action: < xsl:value-of select ="/Result/@Action" /></ p >

< p > User: < xsl:value-of select ="//XmlModel[@xsi:type = 'UserModel']/Login" /></ p >

</ body >

</ html >

</ xsl:template >

</ xsl:stylesheet >




HTML-:



<? xml version ="1.0" encoding ="utf-8" ? >

< html xmlns ="http://www.w3.org/1999/xhtml" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: Home </ p >

< p > Action: Index </ p >

< p > User: root </ p >

</ body >

</ html >




, , , . Controller Action , .



* This source code was highlighted with Source Code Highlighter .

[ Serializable ]

public class Result

{

[ XmlAttribute ]

public string Controller { get ; set ; }

[ XmlAttribute ]

public string Action { get ; set ; }



public List Data { get ; set ; }

}





, , .

Data XmlModel, , XmlInclude XmlModel.

XML- :



< Result Controller ="SomeController" Action ="SomeAction" >

< Data >

<!-- -->

</ Data >

</ Result >






ActionResult. , . c XML-, :



private string _data;

public XmlResult( string data)

{

_data = data;

}




, - ExecuteResult. . :



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}





:



public class XmlResult : ActionResult

{

private string _data;



public XmlResult( string data)

{

_data = data;

}



public override void ExecuteResult(ControllerContext controllerContext)

{

var xslTransform = new XslCompiledTransform();



//

var controller = controllerContext.RouteData.Values[ "controller" ] as string ;

var action = controllerContext.RouteData.Values[ "action" ] as string ;

var templatePath = string .Format( "~/Views/{0}/{1}.xsl" , controller, action);

var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);

// :

//var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile("~/Views/default.xsl");

var xmlReader = XmlReader.Create(virtualFile.Open());

xslTransform.Load(xmlReader);

xmlReader.Close();



var stringReader = new StringReader (_data);

xmlReader = XmlReader.Create(stringReader);



// XML- http-

var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);

xslTransform.Transform(xmlReader, xmlWriter);



stringReader.Close();

xmlReader.Close();

xmlWriter.Close();

}

}





.

ViewData, :



public new List ViewData = new List ();



View, ActionResult . :



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}




:



public abstract class XsltController : Controller

{

public new List ViewData = new List ();



public new ActionResult View()

{

//

var result = new Result

{

Controller = ControllerContext.RouteData.Values[ "controller" ] as string ,

Action = ControllerContext.RouteData.Values[ "action" ] as string ,

Data = ViewData

};

var xmlSerializer = new XmlSerializer( typeof (Result));

var stringWriter = new StringWriter ();

xmlSerializer.Serialize(stringWriter, result);

stringWriter.Close();

// ActionResult

return new XmlResult(stringWriter.ToString());

}

}



:



public class HomeController : XsltController

{

public ActionResult Index()

{

var user = new UserModel { UserId = 1, Login = "root" , Email = "noreply@localhost" };

ViewData.Add(user);

return View();

}

}




. XML:



<? xml version ="1.0" encoding ="utf-16" ? >

< Result xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" Controller ="Home" Action ="Index" >

< Data >

< XmlModel xsi:type ="UserModel" UserId ="1" >

< Login > root </ Login >

< Email > noreply@localhost </ Email >

</ XmlModel >

</ Data >

</ Result >






XSLT-, :



<? xml version ="1.0" encoding ="utf-8" ? >

< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< xsl:output encoding ="utf-8"

method ="xml"

media-type ="application/xhtml+xml"

doctype-public ="-//W3C//DTD XHTML 1.1//EN"

doctype-system ="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />

< xsl:template match ="/" >

< html xmlns ="http://www.w3.org/1999/xhtml" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: < xsl:value-of select ="/Result/@Controller" /></ p >

< p > Action: < xsl:value-of select ="/Result/@Action" /></ p >

< p > User: < xsl:value-of select ="//XmlModel[@xsi:type = 'UserModel']/Login" /></ p >

</ body >

</ html >

</ xsl:template >

</ xsl:stylesheet >




HTML-:



<? xml version ="1.0" encoding ="utf-8" ? >

< html xmlns ="http://www.w3.org/1999/xhtml" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

< head >

< meta http-equiv ="Content-Type" content ="application/xhtml+xml; charset=utf-8" />

< title > XSLT + MVC </ title >

</ head >

< body >

< p > Controller: Home </ p >

< p > Action: Index </ p >

< p > User: root </ p >

</ body >

</ html >




, , , . Controller Action , .



* This source code was highlighted with Source Code Highlighter .

Source: https://habr.com/ru/post/113218/



All Articles