Estoy intentando crear acciones de controlador que devolverán JSON o html parcial según un parámetro. ¿Cuál es la mejor manera de obtener el resultado devuelto a una página MVC de forma asíncrona?Acciones del controlador ASP.NET MVC que devuelven JSON o html parcial
Respuesta
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. Se podría utilizar uno de los métodos auxiliares de la ViewPage como
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod sería un método javascript que se evalúa el objeto JSON devuelto.
Si desea devolver una cadena sencilla, sólo se puede utilizar el ContentResult:
public ActionResult SomeActionMethod() {
return Content("hello world!");
}
ContentResult por defecto devuelve un text/plain como su contentType.
Esta es sobrecargable por lo que también se puede hacer:
return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
Otra buena manera de tratar con datos JSON está utilizando la función jQuery getJSON. Usted puede llamar al método
public ActionResult SomeActionMethod(int id)
{
return Json(new {foo="bar", baz="Blech"});
}
del método jQuery getJSON simplemente ...
$.getJSON("../SomeActionMethod", { id: someId },
function(data) {
alert(data.foo);
alert(data.baz);
}
);
Esto no responde la pregunta en absoluto. – Aaronaught
@Aaronaught En realidad, la primera parte 'devuelve Json (new {foo =" bar ", baz =" Blech "});' does! – SparK
Para responder a 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.
así que ¿no queda la pregunta sin respuesta? –
Esto no responde la pregunta. – Aaronaught
él está buscando una solicitud ajax para obtener el html usando PartialView requiere una actualización de página a menos que devuelva la vista de un método de acción usando una llamada ajax –
Creo que debería 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 poner a prueba como en el objeto de la petición
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 poner en práctica el aspx de la vista para atender el caso XHTML respuesta parcial.
Luego, en jQuery se puede recuperar lo que pasa 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
Esperanza esto ayuda James
Gracias James, que podría ser muy útil para crear una especie de sitio web y un RESTO API que usa las mismas acciones de controlador. – NathanD
Si tengo muchos métodos como este en mi controlador, ¿hay alguna forma de que pueda hacer esto de manera más genérica? – Seph
¿En qué espacio de nombres está la clase Json? ¿Cuál es la dependencia de project.json? Gracias de antemano – Andrei
Es posible que desee echar un vistazo a este artículo muy útil que cubre esta misma ¡bien!
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 han actualizado a MVC 3 aquí es una clara forma Using MVC3 and Json
también puede utilizar la misma técnica que este artículo en MVC 2 – longhairedsi
solución alternativa con incoding framework
retorno Acción JSON
controlador
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncJson(new SomeVm(){Id = 1,Name ="Inc"});
}
página Razor
@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())
retorno Acción 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())
Encontré un par de problemas al implementar MVC ajax GET llamadas con JQuery que me causaron dolores de cabeza por lo que compartí soluciones aquí.
- 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).
- Incluya el
JsonRequestBehavior.AllowGet
; sin este MVC devolvía un error HTTP 500 (condataType: json
especificado en el cliente). - 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. - Finalmente, 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.
JQuery muestra:
$.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);
}
});
Muestra 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);
}
¡Perfecto! Muchas gracias ... –
Funciona como un jefe :) –
Gracias por publicar opciones de solución de problemas para Ajax. Esto me ayudó. – vibs2006
PartialViewResult y JSONReuslt heredar de la ActionResult clase base. 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("<JSON>", JsonRequestBehavior.AllowGet);
else if (parameter == "PartialView")
return PartialView("<ViewName>");
else
return null;
}
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);
}
}
¿podría agregar un poco más de información sobre lo que hace? – RealCheeseLord
- 1. acciones ASP.Net MVC controlador que devuelven vacío
- 2. Diseño de acciones del controlador ASP.NET MVC
- 3. acciones MVC JSON que regresan bool
- 4. Protección de la acción del controlador ASP.NET MVC que devuelve JSON
- 5. ASP.Net MVC: Envío de JSON al controlador
- 6. ASP.NET MVC: ¿Deberían los Controladores llamados por AJAX devolver JSON o rendir html?
- 7. ¿Hay algún atributo relacionado con AJAX que se establezca para las acciones del controlador ASP.NET MVC?
- 8. Asp.net MVC json o Json.net?
- 9. acciones sobrecarga ASP.NET MVC
- 10. Retorno JSON o vista desde el controlador MVC de Spring
- 11. Crear controlador para vista parcial en ASP.NET MVC
- 12. ASP.NET MVC acción 3 controlador de vista parcial
- 13. ASP.NET MVC: ¿Puede una vista parcial tener un controlador?
- 14. asp.net acción de controlador de vista parcial MVC
- 15. acciones sobrecarga del controlador
- 16. En ASP.NET MVC, deserialize JSON antes o en el método de acción del controlador
- 17. ASP.NET MVC: Controlador simulado.Url.Action
- 18. ASP .Net MVC 3: Acciones del controlador de prueba unitaria
- 19. ASP.NET MVC - Pasando JSON DateTime al controlador no mapeando a los parámetros del controlador
- 20. ¿Cómo localizar los nombres y las acciones del controlador en una aplicación ASP.NET MVC?
- 21. ASP.NET MVC Razor: Cómo renderizar un HTML de la vista parcial de Razor dentro de la acción del controlador
- 22. Asignación de botones individuales en ASP.NET MVC Vista para las acciones del controlador
- 23. Ciclo de vida del controlador ASP.NET MVC
- 24. Contexto del controlador Asp.net-mvc burlón
- 25. Enforce Acción de filtrado en todas las acciones del controlador (C#/ASP.NET MVC)
- 26. Rendimiento de asp.net WebAPI vs. asp.net Controlador MVC que emita JSON?
- 27. JSON y ASP.NET MVC
- 28. ASP.NET MVC representación vista parcial con jQuery ajax
- 29. ASP.NET MVC enviando datos JSON a una acción de controlador
- 30. JSON no puede encontrar otra html parcial
siento Phil! esto realmente no responde la pregunta ¿verdad? es definitivamente útil, pero como Brad dice que necesitas descubrir de alguna manera lo que están pidiendo y devolver el resultado en consecuencia. –
vea mi pregunta algo relacionada (bueno, la que me llevó aquí) en http://stackoverflow.com/questions/482363/should-my-mvc-controller-really-know-about-json –
si encuentra una respuesta, vincularlo en la pregunta en sí. Además, no creo que verifique esto, ya que la respuesta es la correcta. – Cherian