我們有一個ASP.NET應用程序。我們不能編輯控制器的源代碼。但是我們可以實現ActionFilter。ASP.NET。如何修改返回的JSON(actionfilter)
我們的控制器操作方法之一返回JSON。有沒有可能在ActionFilter中修改它?我們需要添加一個屬性到一個返回的對象。
也許,其他方式來實現它?
我們有一個ASP.NET應用程序。我們不能編輯控制器的源代碼。但是我們可以實現ActionFilter。ASP.NET。如何修改返回的JSON(actionfilter)
我們的控制器操作方法之一返回JSON。有沒有可能在ActionFilter中修改它?我們需要添加一個屬性到一個返回的對象。
也許,其他方式來實現它?
發現這個有趣的事情和@Chris提到的,雖然從概念上說我知道這會起作用,但我從來沒有試過這個,因此想到給它一個鏡頭。我不確定這是否是一種優雅/正確的方式,但這對我有效。 (我嘗試添加動態使用ActionResult
Age
屬性)
[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());
我認爲在理論上'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