2008-10-22 9 views

Respuesta

443

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"); 
+4

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. –

+0

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 –

+9

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

71

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

Esto no responde la pregunta en absoluto. – Aaronaught

+2

@Aaronaught En realidad, la primera parte 'devuelve Json (new {foo =" bar ", baz =" Blech "});' does! – SparK

12

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.

+2

así que ¿no queda la pregunta sin respuesta? –

+2

Esto no responde la pregunta. – Aaronaught

+0

é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 –

103

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

+3

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

+0

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

+0

¿En qué espacio de nombres está la clase Json? ¿Cuál es la dependencia de project.json? Gracias de antemano – Andrei

4

Para las personas que han actualizado a MVC 3 aquí es una clara forma Using MVC3 and Json

+1

también puede utilizar la misma técnica que este artículo en MVC 2 – longhairedsi

6

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()) 
40

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í.

  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. Incluya 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, 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); 
} 
+0

¡Perfecto! Muchas gracias ... –

+0

Funciona como un jefe :) –

+1

Gracias por publicar opciones de solución de problemas para Ajax. Esto me ayudó. – vibs2006

2

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; 


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

¿podría agregar un poco más de información sobre lo que hace? – RealCheeseLord

Cuestiones relacionadas