将MVC的部分视图作为JSON返回

75

有没有一种方法可以在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);
    }
3个回答

114
你可以从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
7
RenderViewToString() 方法的定义在哪里? - azhar_SE_nextbridge
1
@Sinjai,PartialViewResult 参数中没有 RenderViewToString 方法。但是有其他类似的方法。在此插入该方法将会很有用。 - Muflix
如何传递一个集合对象,例如 ToList() 或 AsQueryable() 对象? - Jun Rikson
你能写一个名为RenderViewToString的方法吗?我需要这样的东西,但是我找不到。谢谢。 - Diego

35

我更喜欢一种类似于RenderViewToString的方法

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

那么你可以在 JavaScript 中捕获结果,然后执行类似以下操作:

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

4
不错的方法。比渲染视图为字符串更加简洁。 - Matija Grcic
33
但这需要更多的 HTTP 请求。 - Rookian
4
但是这个忽略了 JSON 响应中的 "error" 字段。 - James R.
1
Url.Action("Evil", model) 会生成一个 GET 查询字符串,但是你的 AJAX 方法是 POST,这将导致返回 500(内部服务器错误)状态。 - fbarikzehy

0
 $(function () {
        $("select#ExamID").change(function (evt) {

            var classid = $('#ClassId').val();
            var StudentId = $('#StudentId').val();
            $.ajax({
                url: "/StudentMarks/ShowStudentSubjects",
                type: 'POST',
                data: { classId: classid, StudentId: StudentId, ExamID: $(this).val() },
                success: function (result) {
                    $('#ShowStudentSubjects').html(result);
                },
                error: function (xhr) { alert("Something seems Wrong"); }
            });
        });
    });

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Jeremy Caney

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