2011-01-19 5 views
64

Есть ли способ вернуть строку HTML из частичного частичного ответа JSON от MVC?MVC Return Partial View as 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); 
    } 

ответ

102

Вы можете извлечь HTML строку из объекта PartialViewResult, подобный ответ на эту тему:

Render a view as a string

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

omg визуализировать вид на строку! Я никогда об этом не знал. O.O –

+0

, если бы это был вызов ajax, вызывающий ReturnSpecialJsonIfInvalid, я полагаю, что ожидается что-то с возвращенными данными. как бы jquery отличал представление от json? – mko

+2

Где определение метода RenderViewToString()? –

28

Вместо RenderViewToString Я предпочитаю подход, как

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

, то вы можете поймать результат в вашем JavaScript и сделать что-то вроде

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

Красивый подход. Затем очиститель визуализирует строку. –

+27

Но ему нужно больше http-запросов. – Rookian

+3

Но это исключает поле «ошибка» в ответе json. –