2011-09-19 10 views
7

누구나 asp.net MVC 3에서 XSLT를 사용하는 데 경험이 있습니까?ASP .NET MVC 3에서 XSLT 사용

여기서 의도하는 것은 일부 조건에 따라 런타임에 스타일과 레이아웃을 변경할 수있는 페이지를 개발하는 것입니다. 예를 들어, 사용자 프로파일.

하나의 해결책은 별도의 레이아웃 페이지를 사용하여 런타임에 동적 속성 인 Viewbag를 설정하여 설정할 수 있다는 것입니다. 그러나이 방법을 사용하면 페이지에 새 레이아웃을 추가하려는 경우 다시 컴파일해야합니다. 우리는 런타임에 컨트롤러에서 동적으로 XSL을로드하고이를 런타임에 모델 객체에 바인딩 할 수 있다고 생각했습니다. 그런 다음 HTML 컨텐트를 페이지의 미리 정의 된 섹션에 렌더링 할 수 있습니다.

코드 스 니펫이 큰 도움이됩니다.

+0

이것을위한 해결책을 찾았습니까? 너 무슨 짓을 한거야? – XtremeBytes

답변

16

방금 ​​MVC3에 표시 할 XML을 HTML로 변환하는 사이트를 만들었습니다. 컨트롤러가 사용할 XML 및 XSLT 파일을 결정하고이를 모델에 전달하는 두 번째 기법을 사용했습니다. 보기의 HTML 도우미는 실제로 변환을 수행합니다.

이 경우 나는 회의 프로그램을 렌더링하고 있습니다. 따라서 Program은 아래를 참조합니다. 스타일 시트에 매개 변수를 제공 할 수 있습니다. 아래에서는 생성 된 HTML에서 링크로 변환 될 매개 변수로 기본 URL을 제공합니다.

모델 :

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> 
관련 문제