MVC将部分视图作为JSON返回


71

有没有一种方法可以通过将部分内容作为MVC的JSON响应的一部分返回HTML字符串?

    public ActionResult ReturnSpecialJsonIfInvalid(AwesomenessModel model)
    {
        if (ModelState.IsValid)
        {
            if(Request.IsAjaxRequest()
                return PartialView("NotEvil", model);
            return View(model)
        }
        if(Request.IsAjaxRequest())
        {
            return Json(new { error=true, message = PartialView("Evil",model)});
        }
        return View(model);
    }

Answers:


111

您可以从PartialViewResult对象提取html字符串,类似于此线程的答案:

将视图渲染为字符串

PartialViewResult和ViewResult都派生自ViewResultBase,因此相同的方法应适用于两者。

使用上面线程中的代码,您将可以使用:

public ActionResult ReturnSpecialJsonIfInvalid(AwesomenessModel model)
{
    if (ModelState.IsValid)
    {
        if(Request.IsAjaxRequest())
            return PartialView("NotEvil", model);
        return View(model)
    }
    if(Request.IsAjaxRequest())
    {
        return Json(new { error = true, message = RenderViewToString(PartialView("Evil", model))});
    }
    return View(model);
}

如果它将是一个调用ReturnSpecialJsonIfInvalid的ajax调用,我相信它应该返回数据。jQuery如何将视图与JSON区分?
mko 2014年

5
RenderViewToString()方法的定义在哪里?
azhar_SE_nextbridge

1
@Sinjai没有RenderViewToStringPartialViewResult参数的方法。但是还有其他类似的方法。在此处插入方法将很有用。
Muflix

如何传递集合的对象,即ToList()或AsQueryable()对象?
Jun Rikson

33

而不是RenderViewToString我更喜欢这样的方法

return Json(new { Url = Url.Action("Evil", model) });

那么您可以在javascript中捕获结果并执行类似的操作

success: function(data) {
    $.post(data.Url, function(partial) { 
        $('#IdOfDivToUpdate').html(partial);
    });
}

3
好的方法。清理后将视图渲染为字符串。
Matija Grcic'8

31
但是它需要更多的http请求。
Rookian 2013年

4
但这在json响应中省略了“错误”字段。
James R.

1
Url.Action("Evil", model)会生成一个GET查询字符串,但你的Ajax方法后,它会抛出500(内部服务器错误)的错误状态。
Fereydoon Barikzehy

0

Url.Action(“邪恶”,模型)

将生成一个get查询字符串,但您的ajax方法为post,并且将抛出错误状态500(内部服务器错误)。– 2月14日9:51,Fereydoon Barikzehy

只需在您的Json对象上添加“ JsonRequestBehavior.AllowGet”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.