私はジェネリック型のリストにカンマで区切られたパラメータを変換し、本当に素敵なアクションフィルタを見つけました。誰かがWeb APIを使用するためにこれを変換する手助けができますか?あなたがActionFilterAttribute
のために使用されているどのような名前空間Web API用のカスタムアクションフィルタを使用しますか? <a href="http://stevescodingblog.co.uk/fun-with-action-filters/">http://stevescodingblog.co.uk/fun-with-action-filters/</a></p> <p>私はそれを使用したいと思いますが、それはApiControllerのために動作しません、それは完全にそれを無視:
[AttributeUsage(AttributeTargets.Method)]
public class SplitStringAttribute : ActionFilterAttribute
{
public string Parameter { get; set; }
public string Delimiter { get; set; }
public SplitStringAttribute()
{
Delimiter = ",";
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionParameters.ContainsKey(this.Parameter))
{
string value = null;
var request = filterContext.RequestContext.HttpContext.Request;
if (filterContext.RouteData.Values.ContainsKey(this.Parameter)
&& filterContext.RouteData.Values[this.Parameter] is string)
{
value = (string)filterContext.RouteData.Values[this.Parameter];
}
else if (request[this.Parameter] is string)
{
value = request[this.Parameter] as string;
}
var listArgType = GetParameterEnumerableType(filterContext);
if (listArgType != null && !string.IsNullOrWhiteSpace(value))
{
string[] values = value.Split(Delimiter.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var listType = typeof(List<>).MakeGenericType(listArgType);
dynamic list = Activator.CreateInstance(listType);
foreach (var item in values)
{
try
{
dynamic convertedValue = TypeDescriptor.GetConverter(listArgType).ConvertFromInvariantString(item);
list.Add(convertedValue);
}
catch (Exception ex)
{
throw new ApplicationException(string.Format("Could not convert split string value to '{0}'", listArgType.FullName), ex);
}
}
filterContext.ActionParameters[this.Parameter] = list;
}
}
base.OnActionExecuting(filterContext);
}
private Type GetParameterEnumerableType(ActionExecutingContext filterContext)
{
var param = filterContext.ActionParameters[this.Parameter];
var paramType = param.GetType();
var interfaceType = paramType.GetInterface(typeof(IEnumerable<>).FullName);
Type listArgType = null;
if (interfaceType != null)
{
var genericParams = interfaceType.GetGenericArguments();
if (genericParams.Length == 1)
{
listArgType = genericParams[0];
}
}
return listArgType;
}
}
私はそれが簡単ということでした希望をある
。私はちょうど試みたが、それはコンパイルされません。 filterContext.ActionParameters、filterContext.RequestContext、およびfilterContext.RouteDataは認識されません。 – TruMan1
サンプルコード – Jonathan
'System.Web.HttpFilters' - >' System.Web.Http.Filters' –