2010-02-26 21 views
2

我有一個HtmlHelper擴展方法,我想在執行之前應用一些邏輯。我想我正在尋找類似於動作過濾器的行爲,我認爲我可以通過將屬性應用於方法而不需要過濾器上下文來實現。將C#屬性應用到擴展方法來管理擴展方法執行,如動作過濾器

這是我的擴展方法:

[MyHelperAttribute] 
public static string MyHelperMethod(this HtmlHelper html, string text) 
{ 
    TagBuilder tag = new TagBuilder("a"); 

    return tag.ToString(); 
} 

如果是這種屬性的定義:

[AttributeUsage(AttributeTargets.Method)] 
public class MyHelperAttribute: Attribute 
{   
    public MyHelperAttribute() 
    { 
     // get user 
     // if user has permission, execute extension method 
     // else return empty string 
    } 
} 

的問題是,它不點火。 MyHelperAttribute構造函數中的代碼從不執行。有人可以告訴我爲什麼這不起作用,或者我可以做些什麼來使它起作用?

請注意,這是一個體面的方式來管理安全鏈接的生成?有沒有更好的辦法?

感謝

戴夫

回答

2

那不是屬性如何工作。他們只是在編譯時提供一些元數據。在運行時,一些代碼可以使用Reflection來查找屬性。那時候,如果在屬性上有一個方法,可以運行它來做一些事情。

+0

但行動過濾器不是一個屬性相同? Action Filter提供了運行時功能,不是嗎?我的印象是屬性爲方法的執行提供了輔助功能,而不僅僅是元數據。 – DaveDev

+0

@Dave,ASP.NET MVC中實際上有另一個對象(ControllerActionInvoker類),它在調用它之前獲取一個動作的屬性。因此,只要將屬性修飾爲方法,它就不會自動發生。像約翰說的那樣,屬性只是提供一些元數據。 –

+0

@Dave:從1.0版開始,.NET中的屬性一直在.NET中。動作過濾器是新的。 –

0

如果您要做的是根據用戶安全性向HTML中添加一個鏈接,那麼您應該使其成爲HttpContext的擴展方法,它使您可以完全訪問當前頁面的所有屬性,包括用戶上下文。