在模型asp.net mvc中获取绑定属性列表

时间:2014-05-30 00:46:45

标签: c# asp.net-mvc reflection

我的自定义过滤器中有一个这样的控制器

    [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"

1 个答案:

答案 0 :(得分:0)

您可以使用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)。无论如何,上面的代码应该足以让你继续。

希望有所帮助!