asp.net mvc自定义属性

时间:2011-03-23 10:31:26

标签: asp.net asp.net-mvc custom-attributes

我正在尝试在mvc中创建一个自定义属性,以便在视图中将它的参数用作breadCrumb。

嗯,这是属性的代码

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class BreadCrumbAttribute : Attribute {

    public BreadCrumbAttribute(string title, string parent, string url) {
        this._title = title;
        this._parent = parent;
        this._url = url;
    }

    #region named parameters properties
    private string _title;
    public string Title {
        get { return _title; }
    }

    private string _url;
    public string Url {
        get { return _url; }
    }

    private string _parent;
    public string Parent {
        get { return _parent; }
    }
    #endregion

    #region positional parameters properties
    public string Comments { get; set; }
    #endregion

}

这是属性

的调用
[BreadCrumbAttribute("tile", "parent name", "url")]
    public ActionResult Index() {
     //code goes here
     }

这是我想要获取价值的一种方式。 (这是部分观点)

System.Reflection.MemberInfo inf = typeof(ProductsController);
object[] attributes;
attributes = inf.GetCustomAttributes(typeof(BreadCrumbAttribute), false);

foreach (Object attribute in attributes) {
    var bca = (BreadCrumbAttribute)attribute;
    Response.Write(string.Format("{0}><a href={1}>{2}</a>", bca.Parent, bca.Url, bca.Title));
}    

不幸的是,该属性没有以我实现它的方式调用。虽然,如果我在Class中添加属性而不是Action方法,它可以工作。 我怎么能让它发挥作用?

由于

1 个答案:

答案 0 :(得分:2)

问题在于您使用反射来获取类的属性,因此它自然不包含在操作方法上定义的属性。

要获取这些,您应该定义一个ActionFilterAttribute,并且在OnActionExecuting或OnActionExecuted方法中,您可以使用filterContext.ActionDescriptor.GetCustomAttributes()方法(MSDN description here)。

请注意,使用此解决方案,您可能会有两种不同类型的属性:第一种是您编写的属性,用于定义面包屑。第二个是查看执行操作的属性并构建breadcrumb(并且可能将其添加到ViewModel或将其粘贴到HttpContext.Items中)。