Estoy intentando crear acciones de controlador que devuelvan JSON o html parcial dependiendo de un parámetro. Cuál es la mejor manera de obtener el resultado devuelto a una página MVC de forma asíncrona?
En su método de acción, devuelva Json(object) para devolver JSON a su página.
public ActionResult SomeActionMethod() {
return Json(new {foo="bar", baz="Blech"});
}
Luego sólo tienes que llamar al método de acción usando Ajax. Puedes usar uno de los métodos de ayuda de la ViewPage como
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod sería un método javascript que luego evalúa el objeto Json devuelto.
Si quieres devolver una cadena simple, puedes usar simplemente el ContentResult:
public ActionResult SomeActionMethod() {
return Content("hello world!");
}
ContentResult por defecto devuelve un text/plain como contentType.
Esto es sobrecargable por lo que también se puede hacer:
return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
Otra buena forma de tratar los datos JSON es utilizar la función JQuery getJSON. Puedes llamar a la función
public ActionResult SomeActionMethod(int id)
{
return Json(new {foo="bar", baz="Blech"});
}
Método desde el método jquery getJSON simplemente...
$.getJSON("../SomeActionMethod", { id: someId },
function(data) {
alert(data.foo);
alert(data.baz);
}
);
Para responder a la otra mitad de la pregunta, puede llamar:
return PartialView("viewname");
cuando quieras devolver un HTML parcial. Sólo tienes que encontrar alguna manera de decidir si la solicitud quiere JSON o HTML, tal vez basado en una parte/parámetro de la URL.