2017-02-10 2 views
1

Wir haben eine ASP.NET-Anwendung. Wir können den Quellcode von Controllern nicht bearbeiten. Aber wir können ActionFilter implementieren.ASP.NET. Wie man zurückgegebene JSON (actionfilter) ändert

Eine unserer Controller-Aktionsmethoden gibt JSON zurück. Ist es möglich, es in ActionFilter zu ändern? Wir müssen einem zurückgegebenen Objekt eine weitere Eigenschaft hinzufügen.

Vielleicht, eine andere Möglichkeit, es zu erreichen?

+0

Ich denke in der Theorie eine 'OnResultExecuted' sollte tun, was Sie in einem ActionFilter wollen. Es hat Zugriff auf das Ergebnis über context.Result (https://msdn.microsoft.com/en-us/library/system.web.mvc.resultexecutedcontext.result(v=vs.118).aspx#P:System. Web.Mvc.ResultExecutedContext.Result), was es Ihnen erlauben sollte, es wie gewünscht zu manipulieren. Es klingt nicht wie ein * netter * Weg, es zu tun, aber wenn Sie den Controller nicht ändern können und vermutlich nicht ändern können, was Fabriken vom Controller aufgerufen werden, dann klingt es wie Ihre einzige Option. Ich habe es selbst nicht gemacht, also kann ich nicht sicher sagen, dass es funktionieren wird ... – Chris

+0

Wie bekommen Sie den JSON? Bitte zeigen Sie uns den Code, damit wir Ihnen helfen können. – jomsk1e

+0

Können Sie nicht einfach eine neue Aktion erstellen, die die alte Aktion aufruft, dann das Feld hinzufügt und das neue Ergebnis weitergibt? – Milney

Antwort

4

Fand das interessant und als @Chris erwähnt, obwohl konzeptionell wusste ich, dass dies funktionieren würde, ich habe das nie versucht und daher daran gedacht, es zu versuchen. Ich bin mir nicht sicher, ob dies ein eleganter/korrekter Weg ist, aber das hat für mich funktioniert. (Ich versuche Age Eigenschaft dynamisch mit ActionResult hinzufügen)

[PropertyInjector("Age", 12)] 
    public ActionResult Index() 
    { 
     return Json(new { Name = "Hello World" }, JsonRequestBehavior.AllowGet); 
    } 

und der Filter:

public class PropertyInjector : ActionFilterAttribute 
{ 
    string key; 
    object value; 
    public PropertyInjector(string key, object value) 
    { 
     this.key = key; 
     this.value = value; 
    } 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var jsonData = ((JsonResult)filterContext.Result).Data; 
     JObject data = JObject.FromObject(jsonData); 
     data.Add(this.key,JToken.FromObject(this.value)); 

     filterContext.Result = new ContentResult { Content = data.ToString(), ContentType = "application/json" }; 

     base.OnActionExecuted(filterContext); 
    } 
} 

aktualisieren

Wenn es keine dynamischen Daten ist, die injiziert werden soll, um dann Filterkonstruktor und Festcodetaste & Wert direkt entfernen und dann könnte der Filter global ohne Bearbeitung der Steuerung registriert werden

+0

Sicher erfordert dies die Bearbeitung des Controllers, um das Attribut hinzuzufügen? – Milney

+1

@Milney, wenn es nicht dynamische Daten sind, die injiziert werden sollen, dann könnte der Filter global registriert werden, ohne Controller – Developer

+1

@ Milney Registerfilter global zu berühren, muss es überprüfen, um sicherzustellen, dass es die gewünschte Controller-Aktion ist und gewünschte Änderung durchführen, wenn es ist. – Nkosi

Verwandte Themen