私たちはASP.NETアプリケーションを持っています。コントローラのソースコードを編集することはできません。しかし、私たちはActionFilterを実装できます。ASP.NET。返されたJSON(actionfilter)を変更する方法
コントローラのアクションメソッドの1つがJSONを返します。 ActionFilterでそれを変更することは可能ですか?返されるオブジェクトにプロパティをもう1つ追加する必要があります。
多分、それを達成するための他の方法はありますか?
私たちはASP.NETアプリケーションを持っています。コントローラのソースコードを編集することはできません。しかし、私たちはActionFilterを実装できます。ASP.NET。返されたJSON(actionfilter)を変更する方法
コントローラのアクションメソッドの1つがJSONを返します。 ActionFilterでそれを変更することは可能ですか?返されるオブジェクトにプロパティをもう1つ追加する必要があります。
多分、それを達成するための他の方法はありますか?
@Chrisがこのように興味深いとわかりましたが、概念的にはこれがうまくいくことはわかっていましたが、これを試したことはありませんでした。私はこれがエレガントで正しい方法かどうかはわかりませんが、これは私のために働いていました。そして、それが注入される動的なデータがない場合は
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);
}
}
更新
:
[PropertyInjector("Age", 12)]
public ActionResult Index()
{
return Json(new { Name = "Hello World" }, JsonRequestBehavior.AllowGet);
}
とフィルタ(私はAge
動的ActionResult
を使用してプロパティを追加しようとしています)フィルタコンストラクタとハードコードキー&の値を直接削除し、コントローラを編集せずにフィルタをグローバルに登録することができます GlobalFilters.Filters.Add(new PropertyInjector());
理論的には、OnResultExecutedは、あなたがActionFilterで望むことを行うべきだと思います。 context.Result(https://msdn.microsoft.com/en-us/library/system.web.mvc.resultexecutedcontext.result(v=vs.118).aspx#P:System)を介して結果にアクセスできます。 Web.Mvc.ResultExecutedContext.Result)これにより、必要に応じて操作することができます。それは素晴らしい方法のようには聞こえませんが、コントローラーを変更することはできず、おそらくコントローラーによって呼び出される工場を変更することができない場合は、あなたの唯一の選択肢のように思えます。私は自分でそれをしていないので、それが動作することを確実に言うことはできません... – Chris
どのようにJSONを取得していますか?私達が助けることができるように私達にコードを示してください。 – jomsk1e
新しいアクションを作成するだけでは、古いアクションを呼び出してフィールドを追加して新しい結果を渡すことはできませんか? – Milney