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?
Antworten
Zu viele Anzeigen?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");
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
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);
}
);
Ich fand ein paar Probleme bei der Implementierung von MVC ajax GET-Aufrufe mit JQuery, die mir Kopfschmerzen so Sharing-Lösungen hier verursacht.
- 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).
- Fügen Sie die
JsonRequestBehavior.AllowGet
ohne diese MVC wurde ein HTTP 500-Fehler zurückgegeben (mitdataType: json
auf dem Client angegeben). - 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. - 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);
}
- See previous answers
- Weitere Antworten anzeigen