2009-09-26 185 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)) 
     { 
      ... 
     } 
    } 
}