2011-09-19 29 views
7

Có ai có kinh nghiệm sử dụng XSLT trong asp.net MVC 3 không?Sử dụng XSLT trong ASP .NET MVC 3

Mục đích ở đây là để có thể phát triển các trang có kiểu dáng và bố cục có thể thay đổi theo thời gian chạy dựa trên một số điều kiện. ví dụ, hồ sơ người dùng.

Một giải pháp là chúng tôi có thể sử dụng các trang bố cục riêng biệt và đặt thời gian chạy đó bằng cách đặt thuộc tính động Viewbag. Nhưng cách tiếp cận này sẽ yêu cầu biên dịch lại nếu chúng tôi muốn thêm bố cục mới vào trang. Tôi đã nghĩ rằng có thể chúng ta có thể tải một XSL động trong bộ điều khiển trong thời gian chạy và liên kết nó với đối tượng mô hình khi chạy. Nội dung HTML sau đó có thể được hiển thị trong phần được xác định trước trong trang.

Đoạn mã sẽ là trợ giúp tuyệt vời.

+0

Bạn đã tìm ra giải pháp cho việc này chưa? Bạn đã làm gì? – XtremeBytes

Trả lời

16

Tôi vừa xây dựng một trang web biến XML thành HTML để hiển thị trong MVC3. Tôi đã sử dụng kỹ thuật thứ hai, nơi bộ điều khiển xác định các tệp XML và XSLT để sử dụng và chuyển chúng vào mô hình. Trình trợ giúp HTML trong chế độ xem thực sự thực hiện biến đổi.

Trong trường hợp này, tôi sẽ hiển thị một chương trình hội nghị, vì vậy đó là những gì Program đề cập bên dưới. Các tham số có thể được cung cấp cho biểu định kiểu; bên dưới, tôi đang cung cấp URL cơ sở làm thông số sẽ được chuyển thành các liên kết trong HTML được tạo.

Mô hình:

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>(); 
    } 
} 

Bộ điều khiển:

[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); 
    } 

Các helper:

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()); 
     } 

    } 

} 

Quan điểm:

<div data-role="content"> 
@Html.RenderXml(Model.ProgramFilename, Model.StylesheetFilename, Model.Parameters) 
</div> 
Các vấn đề liên quan