2017-02-10 78 views
1

我們有一個ASP.NET應用程序。我們不能編輯控制器的源代碼。但是我們可以實現ActionFilter。ASP.NET。如何修改返回的JSON(actionfilter)

我們的控制器操作方法之一返回JSON。有沒有可能在ActionFilter中修改它?我們需要添加一個屬性到一個返回的對象。

也許,其他方式來實現它?

+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提到的,雖然從概念上說我知道這會起作用,但我從來沒有試過這個,因此想到給它一個鏡頭。我不確定這是否是一種優雅/正確的方式,但這對我有效。 (我嘗試添加動態使用ActionResultAge屬性)

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

和過濾器:

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); 
    } 
} 

更新

如果不是動態的數據將被注入,然後直接刪除過濾器構造函數和硬編碼鍵值&,然後可以在不編輯控制器的情況下全局註冊過濾器 GlobalFilters.Filters.Add(new PropertyInjector());

+0

當然,這確實需要編輯控制器才能添加屬性? – Milney

+1

@Milney如果它不是動態的數據將被注入,然後過濾器可以在全球註冊而不觸及控制器 – Developer

+1

@Milney全球註冊過濾器,有它檢查的要求,以確保它是所需的控制器的動作,並執行,如果需要的變化是。 – Nkosi