我有一个这样的控制器和我的自定义过滤器
[GetBindValueFilter]
public ActionResult EditArtist([Bind(Include = "ID,ArtistName,ArtistDescription,CoverLink")]Artist modelArtist)
{
return View(modelArtist);
}
和我的自定义过滤器获取绑定值是
public class GetBindValueFilterAttribute : ActionFilterAttribute
{
private string keysString;
public GetBindValueFilterAttribute(string keys)
: base()
{
this.keysString = keys;
}
public override void OnActionExecuting(ActionExecutingContext filterContext);
{
//I want to get result like this
var bindPropertyList="ID,ArtistName,ArtistDescription,CoverLink"
// I try this code but it don't work
//var modelList = filterContext.ActionParameters.ToList();
//foreach (var model in modelList)
//{
// var bAttri = model.Value.GetType().GetCustomAttributes(typeof (BindAttribute), false);
//
//}
//
}
}
帮我解决这个问题。我想得到这样的结果
var bindPropertyList="ID,ArtistName,ArtistDescription,CoverLink"
您可以使用filterContext.ActionDescriptor.GetParameters()
获得控制器动作的所有输入参数。然后,您可以以与使用GetCustomAttributes
相同的方式查询每个参数的属性。
例如,这个动作过滤器将正确提取modelArtist参数的包含列表:
public class GetBindValueFilterAttribute : ActionFilterAttribute
{
public string KeysString { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
foreach (var inputParameter in filterContext.ActionDescriptor.GetParameters())
{
var bindAttribute = inputParameter.GetCustomAttributes(typeof(BindAttribute), false)
.Cast<BindAttribute>()
.FirstOrDefault();
if (bindAttribute != null) this.KeysString += " " + bindAttribute.Include;
}
}
}
作为旁注,您可能需要重新考虑您的GetBindValueFilterAttribute
以支持具有多个参数的控制器动作。在这种情况下,可能不是提取字符串,而是提取字典(parameterName-keysStrings)。在任何情况下,上面的代码应该足以让您继续。
希望有帮助!