2009-07-22 11 views
4

私は、JsonResultオブジェクトまたはASP.NETの一部のASP.NETビューをASP.NETのコントローラからうれしく返してきました。ASP.NET MVCのJSONプロパティでレンダリングされたHTML部分を返す

レンダリングされた部分ビューをJSONオブジェクトのプロパティとして返すようにしたいとします。例えば

/post/detail/1 

を要求すると、これは私がJavaScriptでの応答を処理していたときに私はPostIdを知ることができるようになる

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

を返します。これを行う最善の方法のヒント?以下のような

答えて

10

は、私は今日これを行うために必要な原因が動作するいくつかのコードです。 The original code is described here。あなたはその後、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> 
+0

非常にいいです。ありがとう。 –

+0

+1素晴らしい解決策Jake。私の "答え"がうまくいかなかったことを指摘してくれてありがとう - 私が言ったように、私がテストする時間がなかったというアイデアだったとき、あなたが投稿した後、私はもっと深く掘り下げました。なぜなら、なぜ、MVCチームは 'View.Render(文脈、作家)'が作者のパラメータを完全に無視して、レスポンスストリームにまっすぐ書いても私にとどまらないと決めたからです。私は騒音を減らすためにそれを取り除いた。私があなたの時間を無駄にして間違った方向に送ってしまったら、謝罪します。次回は論理的に動作するはずのコードを投稿しますが、実際に最初にテストします。 :) – Alconja

+0

心配しないでください@Alconja - これは、私たちがcodeplexのmvcチームと一緒にオープンしなければならない種類の機能です。 – superlogical

2

何か:ここ

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

は、彼がJsonResultsを使用する方法を知っているように、私は彼がその後の質問はかなり悪い言葉で表現されて化するJsonResult ... – Alconja

+0

でPartialViewを結合しようとしていると思いますね。 – rball

+0

ええ、私はこれが正しい答えだと思っています(そしてそれを提供しようとしていました)... –

0

を持って行うためにそれを使用することができます

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

これは自分がやっているやり方が時代遅れだと思ったからです。私はどこにこれを持って忘れて、それのための信用を取っていないが、私はここに終わったので、私は私も同様に使用するものを投稿すると思う。上記の答えよりも新しい何かを探しに来てくれる人に役立つことを願っています。

**注これは、ビューのレンダリングのみを文字列にアドレス指定します。上記の答えは、結果を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(); 
     } 
    } 
関連する問題