Acciones del controlador ASP.NET MVC que devuelven JSON o html parcial

Estoy intentando crear acciones de controlador que devolverán 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 (objeto) para devolver JSON a su página.

public ActionResult SomeActionMethod() { return Json(new {foo="bar", baz="Blech"}); } 

Luego solo llame al método de acción usando Ajax. Puede usar uno de los métodos auxiliares de la página de visualización, como

 <%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %> 

SomeMethod sería un método de JavaScript que luego evalúa el objeto Json devuelto.

Si desea devolver una cadena simple, puede usar ContentResult:

 public ActionResult SomeActionMethod() { return Content("hello world!"); } 

ContentResult de forma predeterminada devuelve un texto / plano como su contentType.
Esto es sobrecargable, por lo que también puedes hacer:

 return Content("This is poorly formatted xml.", "text/xml"); 

Creo que deberías considerar los AcceptTypes de la solicitud. Lo estoy usando en mi proyecto actual para devolver el tipo de contenido correcto de la siguiente manera.

Su acción en el controlador puede probarlo como en el objeto de solicitud

 if (Request.AcceptTypes.Contains("text/html")) { return View(); } else if (Request.AcceptTypes.Contains("application/json")) { return Json( new { id=1, value="new" } ); } else if (Request.AcceptTypes.Contains("application/xml") || Request.AcceptTypes.Contains("text/xml")) { // } 

A continuación, puede implementar el aspx de la vista para atender el caso de respuesta xhtml parcial.

Luego en jQuery puedes buscarlo pasando el parámetro de tipo como json:

 $.get(url, null, function(data, textStatus) { console.log('got %o with status %s', data, textStatus); }, "json"); // or xml, html, script, json, jsonp or text 

Espero que esto ayude a James

Otra buena forma de tratar con datos JSON es usar la función JQuery getJSON. Puedes llamar al

 public ActionResult SomeActionMethod(int id) { return Json(new {foo="bar", baz="Blech"}); } 

Método del método jquery getJSON simplemente …

 $.getJSON("../SomeActionMethod", { id: someId }, function(data) { alert(data.foo); alert(data.baz); } ); 

Encontré un par de problemas al implementar llamadas MVC ajax GET con JQuery que me causaron dolores de cabeza y compartí soluciones aquí.

  1. Asegúrese de incluir el tipo de datos “json” en la llamada ajax. Esto automáticamente analizará el objeto JSON devuelto por usted (dado que el servidor devuelve JSON válido).
  2. Incluye el JsonRequestBehavior.AllowGet ; sin este MVC devolvía un error HTTP 500 (con dataType: json especificado en el cliente).
  3. Agregue cache: false a la llamada $ .ajax, de lo contrario obtendrá respuestas HTTP 304 (en lugar de respuestas HTTP 200) y el servidor no procesará su solicitud.
  4. Finalmente, el json distingue entre mayúsculas y minúsculas, por lo que la carcasa de los elementos debe coincidir en el lado del servidor y del lado del cliente.

Muestra JQuery:

 $.ajax({ type: 'get', dataType: 'json', cache: false, url: '/MyController/MyMethod', data: { keyid: 1, newval: 10 }, success: function (response, textStatus, jqXHR) { alert(parseInt(response.oldval) + ' changed to ' + newval); }, error: function(jqXHR, textStatus, errorThrown) { alert('Error - ' + errorThrown); } }); 

Ejemplo de código MVC:

 [HttpGet] public ActionResult MyMethod(int keyid, int newval) { var oldval = 0; using (var db = new MyContext()) { var dbRecord = db.MyTable.Where(t => t.keyid == keyid).FirstOrDefault(); if (dbRecord != null) { oldval = dbRecord.TheValue; dbRecord.TheValue = newval; db.SaveChanges(); } } return Json(new { success = true, oldval = oldval}, JsonRequestBehavior.AllowGet); } 

Para responder la otra mitad de la pregunta, puede llamar a:

 return PartialView("viewname"); 

cuando quieres devolver HTML parcial Simplemente tendrá que encontrar la manera de decidir si la solicitud desea JSON o HTML, tal vez en función de una parte / parámetro de la URL.

Solución alternativa con marco de encoding

Acción de retorno json

Controlador

  [HttpGet] public ActionResult SomeActionMethod() { return IncJson(new SomeVm(){Id = 1,Name ="Inc"}); } 

Página Razor

 @using (var template = Html.Incoding().ScriptTemplate("tmplId")) { using (var each = template.ForEach()) {  Id: @each.For(r=>r.Id) Name: @each.For(r=>r.Name) } } @(Html.When(JqueryBind.InitIncoding) .Do() .AjaxGet(Url.Action("SomeActionMethod","SomeContoller")) .OnSuccess(dsl => dsl.Self().Core() .Insert .WithTemplate(Selector.Jquery.Id("tmplId")) .Html()) .AsHtmlAttributes() .ToDiv()) 

Acción retorno html

Controlador

  [HttpGet] public ActionResult SomeActionMethod() { return IncView(); } 

Página Razor

 @(Html.When(JqueryBind.InitIncoding) .Do() .AjaxGet(Url.Action("SomeActionMethod","SomeContoller")) .OnSuccess(dsl => dsl.Self().Core().Insert.Html()) .AsHtmlAttributes() .ToDiv()) 

¡Puede echarle un vistazo a este artículo muy útil que lo cubre muy bien!

Solo pensé que podría ayudar a las personas que buscan una buena solución a este problema.

http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx

Para las personas que se han actualizado a MVC 3 aquí hay una forma ordenada de usar MVC3 y Json

PartialViewResult y JSONReuslt heredan de la clase base ActionResult. entonces si el tipo de devolución se decide dinámicamente, declare el resultado del método como ActionResult.

 public ActionResult DynamicReturnType(string parameter) { if (parameter == "JSON") return Json("", JsonRequestBehavior.AllowGet); else if (parameter == "PartialView") return PartialView(""); else return null; } 
  public ActionResult GetExcelColumn() { List lstAppendColumn = new List(); lstAppendColumn.Add("First"); lstAppendColumn.Add("Second"); lstAppendColumn.Add("Third"); return Json(new { lstAppendColumn = lstAppendColumn, Status = "Success" }, JsonRequestBehavior.AllowGet); } } 

Enfoque flexible para producir diferentes productos según la solicitud

 public class AuctionsController : Controller { public ActionResult Auction(long id) { var db = new DataContext(); var auction = db.Auctions.Find(id); // Respond to AJAX requests if (Request.IsAjaxRequest()) return PartialView("Auction", auction); // Respond to JSON requests if (Request.IsJsonRequest()) return Json(auction); // Default to a "normal" view with layout return View("Auction", auction); } } 

El método Request.IsAjaxRequest() es bastante simple: simplemente comprueba los encabezados HTTP de la solicitud entrante para ver si el valor del encabezado X-Requerido es XMLHttpRequest , que se agrega automáticamente por la mayoría de los navegadores y marcos AJAX.

Método de extensión personalizado para verificar si la solicitud es para json o no para que podamos llamar desde cualquier lugar, al igual que el método de extensión Request.IsAjaxRequest ():

 using System; using System.Web; public static class JsonRequestExtensions { public static bool IsJsonRequest(this HttpRequestBase request) { return string.Equals(request["format"], "json"); } } 

Fuente: https://www.safaribooksonline.com/library/view/programming-aspnet-mvc/9781449321932/ch06.html#_javascript_rendering