【发布时间】:2016-08-24 10:29:38
【问题描述】:
我已经构建了一个 Web API 应用程序,并发现了一个问题(目前在我的代码中处理得不好),该问题总结为包装从所有 API 操作返回的所有 Json 对象与自定义节点(根)。
即:我有这个 json(数组)响应:
[
{
"Category": "Pages",
"Users": [
{
"ID": "1",
"Fname": "Foo",
"Lname": "Bar"
}
]
}
]
并且需要这个回复:
{
"Object": {
"Body": [
{
"Category": "Pages",
"Users": [
{
"ID": "1",
"Fname": "Foo",
"Lname": "Bar"
}
]
}
]
}
}
所以在这里我只是将响应包装在 {"Object":{"Body": <Response Here>}}
我需要将其应用于Array 类型的所有 API Json 响应。
对于简单的 Json 对象响应,我只需要像 {"Object": <Response Here>} 一样包装它
我通过这段代码在每个控制器动作中包装了 Json 响应:
public JsonResult Categories()
{
return Json(new { Object= new { Body= GetCategoriesList() } }, JsonRequestBehavior.AllowGet);
}
当然,这个成就太糟糕了,因为我必须在每个动作中重复这个包装。
我的问题是:
如何创建ActionFilterAttribute 以在每次操作执行后调用以按照上述 Json 示例包装响应?
即用于创建过滤器:
public class JsonWrapper: System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
即调用过滤器:
[JsonWrapper]
public class APIController : Controller
并且还要在同一过滤器中设置响应内容类型"application/json"
【问题讨论】:
-
你需要一个自定义 json 序列化器而不是过滤器。
标签: c# asp.net asp.net-mvc asp.net-web-api action-filter