pages mvc error content ajax asp.net-mvc json asp.net-ajax

content - return error ajax mvc



Acciones del controlador ASP.NET MVC que devuelven JSON o código HTML parcial (11)

¡Es posible que desee echar un vistazo a este artículo muy útil que cubre esto muy bien!

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

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

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?


Creo que deberías considerar los tipos de aceptación 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")) { // }

Luego puede implementar el aspx de la vista para atender el caso de respuesta parcial a xhtml.

Luego, en jQuery puedes obtenerlo pasando el parámetro type 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


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 simplemente llama al método de acción usando Ajax. Podría usar uno de los métodos de ayuda de 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 desea devolver una cadena simple, puede usar ContentResult:

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

ContentResult por defecto devuelve un texto / plano como su contentType.
Esto es recargable por lo que también puede hacer:

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


Encontré un par de problemas al implementar MVC ajax GET llamadas con JQuery que me causaron muchos dolores de cabeza, así que compartir soluciones aquí.

  1. Asegúrese de incluir el tipo de datos "json" en la llamada ajax. Esto analizará automáticamente el objeto JSON devuelto por usted (dado que el servidor devuelve json válido).
  2. Incluir el JsonRequestBehavior.AllowGet ; sin este MVC estaba devolviendo un error HTTP 500 (con dataType: json especificado en el cliente).
  3. Agregue cache: false a la llamada $ .ajax, de lo contrario, obtendrá las respuestas HTTP 304 (en lugar de las 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); } });

Código MVC de muestra:

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


Enfoque flexible para producir diferentes resultados basados ​​en 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 verifica los encabezados HTTP de la solicitud entrante para ver si el valor del encabezado X-Requested With es XMLHttpRequest , que es automáticamente agregado 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, de modo que podamos llamarla desde cualquier lugar, como 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


Otra buena manera de lidiar con los datos JSON es usando la función getQSON de JQuery. 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); } );


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


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

return PartialView("viewname");

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


PartialViewResult y JSONReuslt heredan de la clase base ActionResult. por lo tanto, si el tipo de retorno se decide, declare dinámicamente la salida del método como ActionResult.

public ActionResult DynamicReturnType(string parameter) { if (parameter == "JSON") return Json("<JSON>", JsonRequestBehavior.AllowGet); else if (parameter == "PartialView") return PartialView("<ViewName>"); else return null; }


Solución alternativa con marco de incodificación.

Acción de retorno json

Controlador

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

Página de afeitar

@using (var template = Html.Incoding().ScriptTemplate<SomeVm>("tmplId")) { using (var each = template.ForEach()) { <span> Id: @each.For(r=>r.Id) Name: @each.For(r=>r.Name)</span> } } @(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 de retorno html

Controlador

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

Página de afeitar

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


public ActionResult GetExcelColumn() { List<string> lstAppendColumn = new List<string>(); lstAppendColumn.Add("First"); lstAppendColumn.Add("Second"); lstAppendColumn.Add("Third"); return Json(new { lstAppendColumn = lstAppendColumn, Status = "Success" }, JsonRequestBehavior.AllowGet); } }