MVC Retorna Vista Parcial como JSON

Existe uma maneira de retornar uma string HTML de renderização parcial como parte de uma resposta JSON do 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); } 

Você pode extrair a string html do object PartialViewResult, semelhante à resposta deste thread:

Renderizar uma exibição como uma string

PartialViewResult e ViewResult ambos derivam de ViewResultBase, portanto, o mesmo método deve funcionar em ambos.

Usando o código do tópico acima, você seria capaz de usar:

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

Em vez de RenderViewToString eu prefiro uma abordagem como

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

então você pode pegar o resultado em seu javascript e fazer algo como

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