17

Ajax (jQuery) を使用して呼び出され、画面の一部を更新する部分的なビュー コンテンツを返すかなりの数のコントローラー アクションを含む MVC アプリがあります。しかし、私がやりたいのは、このような JSON を返すことです。

return Json(new { 
    Result = true, 
    Message = "Item has been saved", 
    Content = View("Partial") 
});

HTML は Json の単なるプロパティです。これが意味することは、View メソッドによってレンダリングされる HTML を取得する必要があるということです。これを行う簡単な方法はありますか?私が見たいくつかの例は非常に複雑です。

編集: この質問はもともと ASP.NET MVC 1 に関するものでしたが、バージョン 2 で簡単になった場合は、答えを聞きたいです。

4

9 に答える 9

11

これが答えです!マーティン・フロムの方法からわずかに変更されており、機能しているようです。足りないものがある場合は、コメント セクションでコードの変更を投稿してください。ありがとう。

コントローラーから次のように呼び出します。

string HTMLOutput = Utils.RenderPartialToString("~/Views/Setting/IndexMain.ascx", "", items, this.ControllerContext.RequestContext);

これをクラスに追加する

public static string RenderPartialToString(string controlName, object viewData, object model, System.Web.Routing.RequestContext viewContext)
{
     ViewDataDictionary vd = new ViewDataDictionary(viewData);
     ViewPage vp = new ViewPage { ViewData = vd };

     vp.ViewData = vd;
     vp.ViewData.Model = model;
     vp.ViewContext = new ViewContext();
     vp.Url = new UrlHelper(viewContext);

     Control control = vp.LoadControl(controlName);

     vp.Controls.Add(control);

     StringBuilder sb = new StringBuilder();

     using (StringWriter sw = new StringWriter(sb))
     using (HtmlTextWriter tw = new HtmlTextWriter(sw))
     {
         vp.RenderControl(tw);
     }

     return sb.ToString();
}
于 2009-05-26T15:19:39.850 に答える
2

これは問題の良い解決策です: http://craftycode.wordpress.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

于 2010-05-29T10:06:46.130 に答える
1

この記事の HTML ヘルパーを使用しています: Render partial view to string in ASP.NET MVC。それは完全に機能します!

于 2010-05-05T21:10:09.677 に答える
1

役立つかもしれないRazorを使用して、より最近の回答を見つけましたhttp://codepaste.net/8xkoj2

public static string RenderViewToString(string viewPath, object model,ControllerContext context)
{            
    var viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null);
    var view = viewEngineResult.View;


    context.Controller.ViewData.Model = model;

    string result = String.Empty;
    using (var sw = new StringWriter())
    {

        var ctx = new ViewContext(context, view, 
                                  context.Controller.ViewData, 
                                  context.Controller.TempData, 
                                  sw);
        view.Render(ctx, sw);

        result = sw.ToString();
    }

    return result;
}
于 2012-05-17T23:13:23.093 に答える
1

私は何年も同じことをしようとしてきました。拡張する必要がある簡単な解決策があります。

注: 既に 1 つの問題を確認できます.Cookie やその他の変数はすべて失われます :(

私がしたこと:

  1. 新しい ActionResult を作成する

    public class JsonHtmlViewResult : ViewResult
    {
        public IJsonHtml Data { get; set; }
    
        public override void ExecuteResult(ControllerContext context)
        {
            if (Data == null)
            {
                Data = new DefaultJsonHtml();
            }
    
            using (StringWriter sw = new StringWriter())
            {
                HttpRequest request = HttpContext.Current.Request;
                HttpContext.Current = new HttpContext(request, new HttpResponse(sw));
    
                base.ExecuteResult(context);
    
                Data.HtmlContent = sw.ToString();
            }
    
            // Do the serialization stuff.
            HttpResponseBase response = context.HttpContext.Response;
            response.ClearContent();
            response.ContentType = "application/json";
    
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            response.Write(serializer.Serialize(Data));
        }
    }
    
  2. データクラス

    public interface IJsonHtml
    {
        String HtmlContent { get; set; }
    }
    
    public class DefaultJsonHtml : IJsonHtml
    {
        public String HtmlContent { get; set; }
    }
    
  3. コントローラーの拡張機能

    public static ActionResult JsonHtmlViewResult(this Controller controller, string viewName, string masterName, object model, IJsonHtml data)
    {
        if (model != null)
        {
            controller.ViewData.Model = model;
        }
    
        return new JsonHtmlViewResult
        {
            Data = data,
            ViewName = viewName,
            MasterName = masterName,
            ViewData = controller.ViewData,
            TempData = controller.TempData
        };
    }
    
于 2009-06-22T14:54:56.123 に答える
0

どのバージョン番号からこれを実行できるかはわかりませんが、最近では非常に簡単な方法で JSON を返すことができます。

public ActionResult JSONaction()
{
    return Json(data, JsonRequestBehavior);
}

精巧なヘルパーなどは必要ありません。

data はもちろん、モデルからのデータです JsonRequestBehavior は、クライアントからの HTTP GET リクエストを許可するかどうかを指定します。( source ) はオプションでありDenyGet、デフォルトの動作JsonRequestBehavior.AllowGetです

于 2013-04-09T06:56:35.200 に答える
0

静的な html の「パーシャル」だけを用意して、json からすべての動的コンテンツを取得しないのはなぜですか? ページがロードされたとき、または必要なときに、jquery を使用して html ファイルを簡単にロードできるはずです。

JQuery Ajaxに関するこのリンクは、次の例を示しています。

//Alert out the results from requesting test.php (HTML or XML, depending on what was returned).
$.get("test.php", function(data){
  alert("Data Loaded: " + data);
});
于 2009-05-26T01:08:52.770 に答える