2012-02-11 40 views
24

Tôi đã tìm kiếm trên trang web rất nhiều, nhưng tất cả những gì tôi có thể tìm thấy là các ví dụ về cách hiển thị các điều khiển một phần .ascx hoặc phụ thuộc vào ngữ cảnh của trình điều khiển.Làm thế nào để render một Razor View thành một chuỗi trong ASP.NET MVC 3?

Tôi muốn có một phương pháp cho phép tôi để cung cấp chỉ là đường dẫn tương đối để xem, và một mô hình, và đưa ra quan điểm cho rằng với mô hình thành một chuỗi:

string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model); 

Tất cả các ví dụ tôi có thể tìm Were hoặc cho các phiên bản cũ của MVC, hoặc đơn giản là không làm những gì tôi cần làm ở đây.

Trả lời

26

Bạn có thể đạt được điều đó với razorengine.

string template = "Hello @Model.Name! Welcome to Razor!"; 
string result = Razor.Parse(template, new { Name = "World" }); 

Và nó không dựa vào bối cảnh điều khiển - nhưng vì lý do đó bạn không thể sử dụng người giúp Html (mà dựa vào bối cảnh http). Nhưng nó là hoàn hảo để sử dụng dao cạo như một công cụ mẫu cho dây.

+1

Có cách nào để thực hiện công việc này không nếu tôi có mẫu dao cạo được khóa trong một tệp cshtml ?. Tôi biết hơi muộn của nó cho bữa tiệc. –

+2

Không phải lo lắng - Tôi vẫn ở xung quanh :) Và chắc chắn, chỉ cần tải nội dung thông qua 'File.ReadAllText (đường dẫn);' vào biến. – Marc

+0

Bạn có thể chuyển đối tượng (mô hình) cho chế độ xem không? @Marc – Kennyomar

12

Bạn có thể kiểm tra liên kết này.

nội dung được trích xuất Từ Render Razor view to String. .

public static string RenderRazorViewToString(string viewName, object model) 
{ 
    ViewData.Model = model; 
    using (var sw = new StringWriter()) 
    { 
     var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 
     var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
     viewResult.View.Render(viewContext, sw); 
     return sw.GetStringBuilder().ToString(); 
    } 
} 
+11

vấn đề là ví dụ đòi hỏi một bối cảnh điều khiển, mà tôi không có từ nơi tôi m cố gắng gọi phương thức này. – bevacqua

10

Tôi đã tạo giải pháp cho tôi. Đó là phần mở rộng giúp hiển thị chế độ xem thành chuỗi.

public static class RenderPartialToStringExtensions 
{ 
    /// <summary> 
    /// render PartialView and return string 
    /// </summary> 
    /// <param name="context"></param> 
    /// <param name="partialViewName"></param> 
    /// <param name="model"></param> 
    /// <returns></returns> 
    public static string RenderPartialToString(this ControllerContext context, string partialViewName, object model) 
    { 
     return RenderPartialToStringMethod(context, partialViewName, model); 
    } 

    /// <summary> 
    /// render PartialView and return string 
    /// </summary> 
    /// <param name="context"></param> 
    /// <param name="partialViewName"></param> 
    /// <param name="viewData"></param> 
    /// <param name="tempData"></param> 
    /// <returns></returns> 
    public static string RenderPartialToString(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) 
    { 
     return RenderPartialToStringMethod(context, partialViewName, viewData, tempData); 
    } 

    public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) 
    { 
     ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName); 

     if (result.View != null) 
     { 
      StringBuilder sb = new StringBuilder(); 
      using (StringWriter sw = new StringWriter(sb)) 
      { 
       using (HtmlTextWriter output = new HtmlTextWriter(sw)) 
       { 
        ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output); 
        result.View.Render(viewContext, output); 
       } 
      } 

      return sb.ToString(); 
     } 
     return String.Empty; 
    } 

    public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, object model) 
    { 
     ViewDataDictionary viewData = new ViewDataDictionary(model); 
     TempDataDictionary tempData = new TempDataDictionary(); 
     return RenderPartialToStringMethod(context, partialViewName, viewData, tempData); 
    } 
} 

Và hơn chúng ta có thể làm cho cái nhìn trong Action

[HttpPost] 
public ActionResult GetTreeUnit(string id) 
{ 
    int _id = id.ExtractID(); 
    string render = ControllerContext.RenderPartialToString("SomeView"); 
    return Json(new { data = render }); 
} 
3

Mặc dù Marc là câu trả lời là đúng và làm việc cho các phiên bản trước. Nhưng đó là bây giờ obselete và cần phải được thay thế.

Đây là mã mới mà làm việc cho tôi và bạn có thể tìm thấy thông tin hữu ích hơn trên Github: Razor Engine

string template = "Hello @Model.Name! Welcome to Razor!"; 
string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" }); 
Các vấn đề liên quan