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
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
Wie bekommen Sie den JSON? Bitte zeigen Sie uns den Code, damit wir Ihnen helfen können. – jomsk1e
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