438 Stimmen

ASP.NET MVC-Controller-Aktionen, die JSON oder Teil-HTML zurückgeben

Ich versuche, Controller-Aktionen zu erstellen, die entweder JSON oder teilweise html je nach einem Parameter zurückgeben wird. Was ist der beste Weg, um das Ergebnis asynchron an eine MVC-Seite zurückzugeben?

554voto

Haacked Punkte 56079

Geben Sie in Ihrer Aktionsmethode Json(object) zurück, um JSON an Ihre Seite zurückzugeben.

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

Rufen Sie dann einfach die Aktionsmethode mit Ajax auf. Sie könnten eine der Hilfsmethoden der ViewPage verwenden, wie z.B.

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

SomeMethod wäre eine Javascript-Methode, die dann das zurückgegebene Json-Objekt auswertet.

Wenn Sie eine einfache Zeichenkette zurückgeben möchten, können Sie einfach das ContentResult:

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

ContentResult gibt standardmäßig einen text/plain als ContentType zurück.
Dies ist überlastbar, so dass Sie auch tun können:

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

116voto

James Green Punkte 1807

Ich denke, Sie sollten die AcceptTypes der Anfrage berücksichtigen. Ich verwende es in meinem aktuellen Projekt, um den richtigen Inhaltstyp wie folgt zurückzugeben.

Ihre Aktion auf dem Controller kann sie wie auf dem Request-Objekt testen

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"))
{
   //
}

Sie können dann die aspx der Ansicht implementieren, um für den Fall einer partiellen xhtml-Antwort zu sorgen.

In jQuery können Sie sie dann abrufen, indem Sie den Parameter type als json übergeben:

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

Ich hoffe, das hilft James

84voto

SaaS Developer Punkte 9655

Eine weitere gute Möglichkeit, mit JSON-Daten umzugehen, ist die Verwendung der JQuery-Funktion getJSON. Sie können die

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

Methode aus der Jquery-Methode getJSON durch einfaches...

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

57voto

Shane K Punkte 4455

Ich fand ein paar Probleme bei der Implementierung von MVC ajax GET-Aufrufe mit JQuery, die mir Kopfschmerzen so Sharing-Lösungen hier verursacht.

  1. Stellen Sie sicher, dass Sie den Datentyp "json" in den Ajax-Aufruf aufnehmen. Dadurch wird das zurückgegebene JSON-Objekt automatisch für Sie geparst (vorausgesetzt, der Server gibt gültige json-Daten zurück).
  2. Fügen Sie die JsonRequestBehavior.AllowGet ohne diese MVC wurde ein HTTP 500-Fehler zurückgegeben (mit dataType: json auf dem Client angegeben).
  3. hinzufügen cache: false zum $.ajax-Aufruf hinzufügen, da Sie sonst letztendlich HTTP 304-Antworten (statt HTTP 200-Antworten) erhalten und der Server Ihre Anfrage nicht bearbeitet.
  4. Schließlich wird bei json zwischen Groß- und Kleinschreibung unterschieden, so dass die Groß- und Kleinschreibung der Elemente auf der Server- und der Client-Seite übereinstimmen muss.

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

Beispiel für MVC-Code:

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

12voto

Brad Wilson Punkte 64944

Um die andere Hälfte der Frage zu beantworten, können Sie anrufen:

return PartialView("viewname");

wenn Sie teilweise HTML zurückgeben möchten. Sie müssen nur einen Weg finden, um zu entscheiden, ob die Anfrage JSON oder HTML will, vielleicht basierend auf einem URL-Teil/Parameter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X