2017-02-10 3 views
1

私たちはASP.NETアプリケーションを持っています。コントローラのソースコードを編集することはできません。しかし、私たちはActionFilterを実装できます。ASP.NET。返されたJSON(actionfilter)を変更する方法

コントローラのアクションメソッドの1つがJSONを返します。 ActionFilterでそれを変更することは可能ですか?返されるオブジェクトにプロパティをもう1つ追加する必要があります。

多分、それを達成するための他の方法はありますか?

+0

理論的には、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

+0

どのようにJSONを取得していますか?私達が助けることができるように私達にコードを示してください。 – jomsk1e

+0

新しいアクションを作成するだけでは、古いアクションを呼び出してフィールドを追加して新しい結果を渡すことはできませんか? – Milney

答えて

4

@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());

+0

これは確かに属性を追加するためにコントローラを編集する必要がありますか? – Milney

+1

@Milney注入する動的データでなければ、コントローラーに触れることなくフィルターをグローバルに登録することができます。 – Developer

+1

@Milneyレジスターフィルターをグローバルに登録し、必要なコントローラーアクションであることを確認し、です。 – Nkosi

関連する問題