我正在尝试在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方法,它可以工作。 我怎么能让它发挥作用?
由于
答案 0 :(得分:2)
问题在于您使用反射来获取类的属性,因此它自然不包含在操作方法上定义的属性。
要获取这些,您应该定义一个ActionFilterAttribute,并且在OnActionExecuting或OnActionExecuted方法中,您可以使用filterContext.ActionDescriptor.GetCustomAttributes()
方法(MSDN description here)。
请注意,使用此解决方案,您可能会有两种不同类型的属性:第一种是您编写的属性,用于定义面包屑。第二个是查看执行操作的属性并构建breadcrumb(并且可能将其添加到ViewModel或将其粘贴到HttpContext.Items中)。