Ich habe einen Adressbuch-Controller, der eine Liste von "Ordnern" (im Grunde Gruppen / Orte) zurückgibt. Dies kann über eine AJAX-Anfrage oder innerhalb einer MVC-Seite selbst zur Renderzeit aufgerufen werden.
Wie kann ich eine Funktion erstellen, die für beide Szenarien gut funktioniert? Hier ist meine aktuelle Controller-Aktion, mit der ich auf meiner MVC-Seite zu kämpfen habe
%Vor%Innerhalb der Seite (nicht funktionierend)
%Vor% Haben Sie einfach eine Funktion, die List
zurückgibt, und rufen Sie sie dann sowohl in Ihrer Seitenlade- als auch in der AJAX-Anfrageaktionsmethode auf.
Etwas wie:
%Vor%Dann können Sie beim Laden der Seite das in Ihr Modell einfügen:
%Vor%Dann können Sie aus Ihrer Sicht tun:
%Vor%Nehmen Sie dann an, Ihre Ajax-Anfrage wäre etwas wie:
%Vor% Ihre GetFolders
Aktionsmethode würde wie folgt aussehen:
Zuallererst sollten Sie aus Ihrer Sicht niemals so etwas tun:
%Vor%Dies erzeugt eine enge Verbindung zwischen Ihrer Sicht und dem Controller, was ziemlich gegen die Prinzipien von MVC verstößt. Nun, um deine Fragen zu beantworten.
Wie bereits erwähnt, möchten Sie eine stark typisierte Ansicht verwenden und Ihre Liste aus dem Sichtenmodell holen. Etwas wie das Folgende würde für den einfachen Fall funktionieren. Wenn diese Ansicht komplexer wird, benötigen Sie ein tatsächliches Ansichtsmodellobjekt:
%Vor%Nun können Sie eine Controller-Methode für AJAX oder eine normale Anfrage zusammen mit Request.IsAjaxRequest verwenden, wie Maris darauf hingewiesen hat. Angenommen, Ihre Ansicht heißt "FolderList", würde die Controller-Aktion wie folgt aussehen:
%Vor%Wenn Sie nun diese Methode über AJAX aufrufen, wird die JSON-Darstellung der Ordnerliste zurückgegeben, andernfalls wird die Ansicht der Ordnerliste zurückgegeben.
Ich habe einmal eine ActionFilter
geschrieben, die genau das tut, überschreibt die ActionResult
mit JsonResult
, sobald die Accept
http-Kopfzeile json
enthält (und könnte sich nur auf Ajax-Anfragen beschränken, indem onAjaxOnly
mit true
):
Dann behalten Sie Ihre Action
so, wie sie ist, fügen Sie einfach die neue ReturnJsonIfAccepted
Attribute
:
Tags und Links asp.net-mvc c# razor json asp.net-mvc-4