【问题标题】:Using XSLT in ASP .NET MVC 3在 ASP .NET MVC 3 中使用 XSLT
【发布时间】:2011-09-19 13:03:16
【问题描述】:

有人有在 asp.net MVC 3 中使用 XSLT 的经验吗?

这里的目的是能够开发出可以根据某些条件在运行时更改样式和布局的页面。例如,用户个人资料。

一个解决方案是我们可以使用单独的布局页面并在运行时通过设置动态属性 Viewbag 来设置。但是如果我们想向页面添加新布局,这种方法需要重新编译。我在想,也许我们可以在运行时在控制器中动态加载 XSL,并在运行时将其绑定到模型对象。然后可以在页面的预定义部分中呈现 HTML 内容。

代码 sn-p 会很有帮助。

【问题讨论】:

  • 您找到解决方案了吗?你最后做了什么?

标签: asp.net-mvc xslt


【解决方案1】:

我刚刚建立了一个将 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多