Asp.net MVC:将HTML作为Json对象返回

5
我想在我的JSON对象中返回HTML,但似乎不起作用,我的代码如下:
```javascript { "content": "

Hello World!

" } ```
return new JsonResult()
{
 Data = new { Error = false, NewComment = PartialView("Review/InlineCommentUC", dto) }
};

我希望NewComment内部有一些HTML代码...
在使用firebug查看NewComment对象的json格式时,我得到的结果如下:
TempData = []
View = null,
ViewData = []
ViewEngineCollection = some data..
ViewName = name of view

我正在使用Jquery将输出呈现在html上,发送json对象的原因是可以轻松处理错误。理想情况下,我正在寻找一个自定义的Action结果...

为什么你想这样做呢?也许有其他解决方案可以解决你的问题? - Tomas Jansson
@TomasJansson:为什么不这样做呢?在我看来,虽然我已经处理了ajax请求、服务器端和客户端,但这是当处理错误时最简单的解决方案,我只需要返回以下内容:*return new JsonResult(){ Data = new { Error = true, Msg= errMsg.ToString() }};*其中errMsg与我的域代码绑定,这是我处理所有异常的地方... - Haroon
@TomasJansson - 如果我没记错的话,即使Github也这样做。 - Haroon
为了更好地区分视图和实现,我建议返回一个“干净”的 JSON 对象,包含属性,并在客户端解析。如果使用jQuery模板或类似工具,解析不应该太困难。 - Tomas Jansson
@TomasJansson:完全同意你的观点,但我目前并不依赖于jQuery模板,我可能会在以后决定采用模板,并且大量使用它,但现在无法这样做,因此上面的解决方案是目前唯一的出路。无论如何,感谢你的建议... - Haroon
2个回答

6

你是否需要的是这个链接提供的内容:http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

使用 WayBackMachine 复制。

我遇到了这样一种情况:我想将一个部分视图渲染成字符串,然后作为 JSON 响应的一部分返回,如下所示:

return Json(new {
    statusCode = 1,
    statusMessage = "The person has been added!",
    personHtml = PartialView("Person", person)
});

实现这样的功能将会开启大量惊人的可能性,所以我在网上搜索解决方案。不幸的是,似乎没有人提出一个干净的解决方案,所以我深入研究了MVC代码并提出了一个解决方案......因为我是个好人,你可以免费复制它。 ;)
public abstract class MyBaseController : Controller {

    protected string RenderPartialViewToString()
    {
        return RenderPartialViewToString(null, null);
    }

    protected string RenderPartialViewToString(string viewName)
    {
        return RenderPartialViewToString(viewName, null);
    }

    protected string RenderPartialViewToString(object model)
    {
        return RenderPartialViewToString(null, model);
    }

    protected string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter()) {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }
}

现在你可以简单地这样做:
public class MyController : MyBaseController {

    public ActionResult CreatePerson(Person p) {
        if (ModelState.IsValid) {
            try {
                PersonRepository.Create(p);
                return Json(new {
                    statusCode = 1,
                    statusMessage = "The person has been added!",
                    personHtml = RenderPartialViewToString("Person", p)
                });
            }
            catch (Exception ex) {
                return Json(new {
                    statusCode = 0,
                    statusMessage = "Error: " + ex.Message
                });
            }
        }
        else
            return Json(new {
                statusCode = 0,
                statusMessage = "Invalid data!"
            });
    }
}

还要注意,您可以通过进行小改动来修改这些函数,以呈现视图(而不是PartialView):
ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName);

享受!


谢谢...我本来想创建一个自定义的Action Result,但现在我决定不这样做了...你知道这样会影响性能吗? - Haroon
@MotoWilliams 我已经获取了原始内容并将其重新添加到我的答案中。 - JesseBuesking

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接