using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Mvc;
//using System.Web.Http.Filters;
namespace Filters
{
public class TestFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
/*var par = filterContext.ActionParameters;
var newRequest =new Dictionary<string, object>();
foreach (var key in filterContext.ActionParameters.Keys)
{
var thisValue = par[key];
JObject json = JsonConvert.DeserializeObject<JObject>(JsonConvert.SerializeObject(thisValue));
var newJson = CopyJObject(json);
newRequest.Add(key, newJson);
filterContext.ActionParameters = newRequest;
}*/
var parameters = filterContext.ActionDescriptor.GetParameters();
foreach (var parameter in parameters)
{
var para = filterContext.ActionParameters[parameter.ParameterName];
if (para==null)
{
}
else if (para.GetType() == typeof(string))
{
filterContext.ActionParameters[parameter.ParameterName] = para.ToString().Trim();
}
else
{
try
{
JObject json = JsonConvert.DeserializeObject<JObject>(JsonConvert.SerializeObject(para));
var newJson = CopyJObject(json);
var tt = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(newJson), para.GetType());
filterContext.ActionParameters[parameter.ParameterName] = tt;
}
catch (Exception)
{//不可序列化的不做修改
}
}
}
base.OnActionExecuting(filterContext);
}
public static JObject CopyJObject(JObject orgJObject)
{
var desJObject = new JObject();
foreach (var pro in orgJObject)
{
if (pro.Value == null)
continue;
if (pro.Value is JObject)
{
JObject des = CopyJObject((JObject)pro.Value);
desJObject[pro.Key.Trim()] = des;
}
if (pro.Value is JValue)
{
if (string.IsNullOrEmpty((string)pro.Value)) continue;
desJObject.Add(pro.Key, pro.Value.ToString().Trim());
}
if (pro.Value is JArray)
{
JArray array = new JArray();
foreach (var item in (JArray)pro.Value)
{
if (item is JObject)
{
JObject des = CopyJObject((JObject)item);
array.Add(des);
}
if (item is JValue)
{
array.Add(item.ToString().Trim());
}
}
if (array.Count != 0)
desJObject.Add(pro.Key.Trim(), array);
}
}
return desJObject;
}
}
}
全局调用:
App_Start下的FilterConfig.cs 添加 filters.Add(new TestFilter());
Global.asax下添加FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
个别控制器调用,不全局注册然后使用:[TestFilter]