2011-03-23 224 views
0

我想在mvc中創建一個自定義屬性,以在視圖中將它的參數用作breadCrumb。asp.net mvc自定義屬性

好,這是屬性

[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方法,它就起作用了。 我怎麼能使它工作?

感謝

回答

2

的問題是,你正在使用反射來獲取該類的屬性,因此它自然不包括操作方法定義的屬性。

爲了獲得這些,你應該定義一個ActionFilterAttribute,並且在OnActionExecuting或OnActionExecuted方法中,可以使用filterContext.ActionDescriptor.GetCustomAttributes()方法(MSDN description here)。

請注意,使用此解決方案,您可能會擁有兩種不同類型的屬性:第一種是您寫的定義麪包屑的屬性。第二個是查看正在執行的動作的屬性並構建麪包屑(並且可能將其添加到ViewModel或將其粘貼到HttpContext.Items或其他東西中)。

+0

你的意思是BreadCrubAttribute將從System.Attribute擴展,我必須創建一個更多的屬性,可以說GetBreadCrumbAttribute這將從ActionFilterAttribute擴展? – StrouMfios 2011-03-23 13:14:06

+0

正確。 GetBreadCrumbAttribute只存在於一個地方(假設你可以將它放在一個BaseController類中,其中所有其他控制器都會下降),並且如我所述,它將負責將它找到的麪包屑放在一起,並將它們放置在控制器的某個位置和/或視圖可以檢索它們。 – 2011-03-23 17:14:40