【问题标题】:Returning a rendered HTML partial in a JSON Property in ASP.NET MVC在 ASP.NET MVC 的 JSON 属性中返回呈现的 HTML 部分
【发布时间】:2009-07-22 23:14:42
【问题描述】:

我一直很高兴地从 ASP.NET 中的控制器返回 JsonResult 对象或部分 ASP.NET 视图。

我想将渲染的局部视图作为 JSON 对象中的属性返回。例如

请求

/post/detail/1

会返回

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

当我在 JavaScript 中处理响应时,这将让我知道 PostId。有什么关于最好的方法的提示吗?

【问题讨论】:

    标签: asp.net-mvc json


    【解决方案1】:

    这里有一些有效的代码,因为我今天需要这样做。 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);
    }
    

    并且partial 有一个强类型的视图模型

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

    【讨论】:

    • +1 不错的解决方案杰克。感谢您指出我的“答案”不起作用 - 就像我说的那样,当时这只是一个我没有时间测试的想法。在您发布之后,我深入挖掘,这绝对是一个红鲱鱼(为什么 MVC 团队决定 View.Render(context, writer) 应该完全忽略 writer 参数并直接写入响应流,这超出了我的能力范围)。我已将其移除以减少噪音。如果我浪费了您的时间让您走错了路,我深表歉意。下次我发布逻辑上看起来应该可以工作的代码时,我将首先对其进行实际测试。 :)
    • No Worries @Alconja - 这些是我们应该在 codeplex 上与 mvc 团队一起开放的功能,让猫投票,这些问题就会消失 :)
    【解决方案2】:

    类似:

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

    【讨论】:

    • 听起来他知道如何使用 JsonResults,我认为他正在尝试将 PartialView 与 JsonResult 结合起来......
    • 那么这个问题的措辞很糟糕。
    • 是的,考虑到问题,我也认为这是正确的答案(并且将提供它)......
    【解决方案3】:

    我自己正在寻找一种更好的方法来做这件事,因为我认为我做这件事的方式已经过时了。我忘记了我从哪里得到的,也没有得到它的功劳,但既然我最终来到这里,我想我也会发布我使用的东西。希望它可以帮助任何寻找比上述答案更新的东西的人。

    ** 注意这仅解决了将视图呈现为字符串的问题。上面的答案解决了将结果放入 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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 2013-03-13
      • 2011-05-23
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多