2009-07-22 119 views
4

我一直很高興地從ASP.NET的控制器中返回JsonResult對象或部分ASP.NET視圖。在ASP.NET MVC中返回JSON屬性中呈現的HTML部分

我想返回一個呈現的局部視圖作爲JSON對象中的一個屬性。例如

請求

/post/detail/1 

將返回

{"PostId": 1, "Html": "<p>some markup rendered from a partial to inject</p>" } 

這將讓我知道,當我處理JavaScript中的響應的帖子ID。任何提示最好的方法來做到這一點?

回答

10

下面是一些代碼,因爲我需要這個今天這樣做會奏效。 The original code is described here

public static string RenderPartialToString(string controlName, object viewData) 
{ 
    var viewContext = new ViewContext(); 
    var urlHelper = new UrlHelper(viewContext.RequestContext); 
    var viewDataDictionary = new ViewDataDictionary(viewData); 

    var viewPage = new ViewPage 
    { 
     ViewData = viewDataDictionary, 
     ViewContext = viewContext, 
     Url = urlHelper 
    }; 

    var control = viewPage.LoadControl(controlName); 
    viewPage.Controls.Add(control); 

    var sb = new StringBuilder(); 
    using (var sw = new StringWriter(sb)) 
    using (var tw = new HtmlTextWriter(sw)) 
    { 
      viewPage.RenderControl(tw); 
    } 

    return sb.ToString(); 
} 

然後,您可以用它做RJS風格JSON結果

public virtual ActionResult Index() 
{ 
    var jsonResult = new JsonResult 
    { 
     Data = new 
     { 
      main_content = RenderPartialToString("~/Views/contact/MyPartial.ascx", new SomeObject()), 
      secondary_content = RenderPartialToString("~/Views/contact/MyPartial.ascx", new SomeObject()), 
     } 
    }; 

    return Json(jsonResult, JsonRequestBehavior.AllowGet); 
} 

和部分有一個強類型的視圖模型

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeObject>" %> 
<h1>My Partial</h1> 
2

喜歡的東西:

return new JsonResult { Data = new { PostId = 1; Html = "<p>some markup rendered from a partial to inject</p>" } }; 
+0

聽起來像是他知道如何使用JsonResults,我認爲他試圖將PartialView有JsonResult ... – Alconja 2009-07-23 00:15:14

+0

接下來的問題是措辭相當糟糕結合起來​​。 – rball 2009-07-23 16:47:36

0

我一直在尋找一個更好的方式做這是我自己,因爲我認爲我做這件事的方式已經過時了。我忘了我在哪裏得到這個,並沒有相信它,但是因爲我在這裏結束了,我想我會發布我使用的。希望它能幫助任何人前來尋找比上述答案更新的東西。

**注意這隻能解決視圖呈現爲字符串的問題。上面的答案解決了將結果放入JSON對象中的屬性的問題,而且OP似乎對此很滿意。

public string RenderViewToString(string viewName, object model) 
    { 
     ViewData.Model = model; 
     using (var sw = new StringWriter()) 
     { 
      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 
      var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 
相關問題