Использование XSLT в ASP .NET MVC 3 - PullRequest
7 голосов
/ 19 сентября 2011

Есть ли у кого-нибудь опыт использования XSLT в asp.net MVC 3?

Намерение здесь состоит в том, чтобы иметь возможность разрабатывать страницы, стиль и макет которых можно изменять во время выполнения в зависимости от некоторых условий.например, профиль пользователя.

Одним из решений является то, что мы можем использовать отдельные страницы макета и установить их во время выполнения, установив динамическое свойство Viewbag.Но этот подход потребует перекомпиляции, если мы хотим добавить новый макет на страницу.Я подумал, что, возможно, мы могли бы динамически загрузить XSL в контроллер во время выполнения и связать его с объектом модели во время выполнения.Содержимое HTML может быть визуализировано в предопределенном разделе на странице.

Фрагмент кода будет очень полезен.

1 Ответ

16 голосов
/ 07 октября 2011

Я только что создал сайт, который преобразует 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...