在ASP .NET MVC 3中使用XSLT 3
问题描述:
有没有人在使用asp.net MVC 3中的XSLT方面有经验?在ASP .NET MVC 3中使用XSLT 3
此处的目的是为了能够开发可以在运行时根据某些条件更改样式和布局的页面。例如,用户配置文件。
一个解决方案是我们可以使用单独的布局页面,并通过设置动态属性Viewbag在运行时设置它。但是如果我们想在页面中添加新的布局,这种方法需要重新编译。我在想,也许我们可以在运行时在控制器中动态加载XSL,并在运行时将它绑定到模型对象。 HTML内容然后可以在页面的预定义部分中呈现。
代码片段将是一个很大的帮助。
答
我刚刚构建了一个将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>
你有没有找到解决方案?你最终做了什么? – XtremeBytes