2011-01-19 19 views
64

¿Hay alguna forma de devolver una cadena HTML para que no represente un parcial como parte de una respuesta JSON de MVC?Vista parcial de retorno de MVC como JSON

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

Respuesta

102

Puede extraer la cadena html del objeto PartialViewResult, similar a la respuesta a este tema:

Render a view as a string

PartialViewResult y ViewResult ambos derivan de ViewResultBase, por lo que el mismo método debería funcionar en ambos.

Utilizando el código de la rosca anterior, debería ser capaz de utilizar:

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

¡omg render view to string! Nunca supe de eso. O.O –

+0

si se tratara de una llamada ajax llamando a ReturnSpecialJsonIfInvalid, creo que se espera algo con los datos devueltos. ¿cómo jquery diferenciaría la vista de json? – mko

+2

¿Dónde está la definición del método RenderViewToString()? –

28

En lugar de RenderViewToString prefiero un enfoque como

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

continuación, se puede coger el resultado en su javascript y hacer algo como

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

Buen enfoque. Cleaner luego renderizando la vista a la cadena. –

+27

Pero necesita más solicitudes http. – Rookian

+3

Pero esto deja fuera el campo 'error' en la respuesta json. –

Cuestiones relacionadas