2009-09-26 183 views
3

我有一個名爲CheckArticleExistence的子類AuthorizeAttribute。自定義授權屬性

我想使用我在動作中收到的參數來設置屬性。就像這樣:

[CheckArticleExistence(Id=articleId)] 
public ActionResult Tags(int articleId) 
{ 
... 
} 

我想使用條款ArticleID檢查,如果在數據庫中存在的文章,如果沒有我可以用OnAuthorization方法觸發不同的東西。

有什麼辦法嗎? 謝謝。

+0

這是在OnAuthorization階段做了什麼? – 2009-09-26 20:51:28

+0

請您能更清楚您實際上想用articleId做什麼? – 2009-09-26 20:54:28

回答

3

我想你可以從AuthorizationContext得到條款ArticleID,所以你不需要把它作爲屬性的屬性。

你可以這樣做:

[CheckArticleExistence] 
public ActionResult Tags(int articleId) 
{ 
... 
} 
3

您可以在存儲庫中放入一個方法來檢查文章的存在。

public ActionResult Tags(int articleId) 
{ 
    if (repository.ArticleExists(articleID)) 
    { 
     // Do your thing 
    } 
    else 
    { 
     return view("NotFound"); // or do something else 
    } 
} 

或者您可以簡單地嘗試檢索文章,並檢查空對象。

public ActionResult Tags(int articleId) 
{ 
    var article = repository.GetArticle(); 
    if (article !=null) 
    { 
     // Do your thing 
    } 
    else 
    { 
     return view("NotFound"); // or do something else 
    } 
} 
+0

是的,我同意。這可能是說實話最好的做法。 – 2009-09-26 21:10:18

+0

但是這是明顯的方法......我想使用AuthorizeAttribute,因爲如果我決定改變處理文章非存在的方式,則不需要更改檢查文章是否存在的所有操作。無論如何,謝謝 – Wellington 2009-09-26 21:14:40

+0

希望您的存儲庫始終只有一種檢查方法。你可以在那裏改變你的實現。 – 2009-09-26 21:14:55

4

這一個工作(謝謝!):

[CheckArticleExistence] 
public ActionResult Tags(int articleId) 
{ 
    ... 
} 

... 

public class CheckArticleExistenceAttribute : AuthorizeAttribute 
{ 
    private int articleId; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 

     this.articleId = int.Parse(filterContext.RouteData.Values["id"].ToString()); 

     if (!Article.Exists(articleId)) 
     { 
      ... 
     } 
    } 
}