【问题标题】:ASP.NET. How to modify returned JSON (actionfilter)ASP.NET。如何修改返回的 JSON (actionfilter)
【发布时间】:2017-06-28 14:13:27
【问题描述】:

我们有一个 ASP.NET 应用程序。我们无法编辑控制器的源代码。但是我们可以实现 ActionFilter。

我们的控制器操作方法之一返回 JSON。是否可以在 ActionFilter 中对其进行修改?我们需要为返回的对象再添加一个属性。

也许,还有其他方法可以实现它?

【问题讨论】:

  • 我认为理论上 OnResultExecuted 应该在 ActionFilter 中执行您想要的操作。它可以通过 context.Result (msdn.microsoft.com/en-us/library/…) 访问结果,这应该允许您根据需要操作它。这听起来不像是一种 nice 的方法,但是如果您不能更改控制器并且可能无法更改控制器调用的任何工厂,那么这听起来像是您唯一的选择。我自己没有做过,所以不能肯定它会起作用......
  • 您是如何获得 JSON 的?请向我们展示代码,以便我们提供帮助。
  • 你能不能只创建一个新动作,调用旧动作然后添加字段并传递新结果?

标签: asp.net json asp.net-mvc asp.net-mvc-filters


【解决方案1】:

发现这很有趣,正如@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);
    }
}

更新

如果要注入的不是动态数据,那么直接去掉filter构造函数和硬编码key&value,就可以全局注册filter而不需要修改controller GlobalFilters.Filters.Add(new PropertyInjector());

【讨论】:

  • 这确实需要编辑控制器才能添加属性?
  • @Milney 如果要注入的不是动态数据,那么过滤器可以在不接触控制器的情况下全局注册
  • @Milney 全局注册过滤器,让它检查请求以确保它是所需的控制器操作,如果是,则执行所需的更改。
猜你喜欢
  • 2013-06-23
  • 2014-03-10
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多