Marty Trenouth
Marty Trenouth

Reputation: 3752

MVC Return Partial View as JSON

Is there a way to return an HTML string from rendering a partial as part of a JSON response from MVC?

    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);
    }

Upvotes: 75

Views: 122341

Answers (3)

Nirpat Chaudhary
Nirpat Chaudhary

Reputation: 1

 $(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"); }
            });
        });
    });

Upvotes: 0

cacois
cacois

Reputation: 2076

You can extract the html string from the PartialViewResult object, similar to the answer to this thread:

Render a view as a string

PartialViewResult and ViewResult both derive from ViewResultBase, so the same method should work on both.

Using the code from the thread above, you would be able to use:

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);
}

Upvotes: 114

Manatherin
Manatherin

Reputation: 4187

Instead of RenderViewToString I prefer a approach like

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

then you can catch the result in your javascript and do something like

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

Upvotes: 35

Related Questions