So erstellen Sie einen ActionController, der sowohl zur Laufzeit als auch mit ajax funktioniert

8

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%     
Chris 23.05.2013, 14:50
quelle

4 Antworten

9

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:

%Vor%     
mattytommo 23.05.2013, 14:55
quelle
5

Das wird funktionieren:

%Vor%     
Maris 23.05.2013 14:55
quelle
2

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.

    
portlandrock 23.05.2013 15:44
quelle
0

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 ):

%Vor%

Dann behalten Sie Ihre Action so, wie sie ist, fügen Sie einfach die neue ReturnJsonIfAccepted Attribute :

an %Vor%     
haim770 23.05.2013 15:47
quelle