tags:

views:

187

answers:

3

I have a child class of AuthorizeAttribute named CheckArticleExistence.

I would like to set an attribute using the parameter that I receive in the action. Like this:

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

I want to use the articleId to check if that article exists in the database, and if it doesn't I can trigger something different using the OnAuthorization method.

Is there any way? Thanks.

+3  A: 

You can put a method in your repository to check for the existence of an article.

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

Or you can simply attempt to retrieve the article, and check for a null object.

public ActionResult Tags(int articleId)
{
    var article = repository.GetArticle();
    if (article !=null)
    {
        // Do your thing
    }
    else
    {
        return view("NotFound"); // or do something else
    }
}
Robert Harvey
Yes, I agree. This would probably be the best thing to do to be honest.
Dan Atkinson
But this one is the obvious way... I would like to use an AuthorizeAttribute because if I decide to change the way I handle the article nonexistence, I do not need to change all the actions that check if the article exists. Anyway, thank you
Wellington
Hopefully your repository always has just one way to check. You can change your implementation there.
Robert Harvey
this gives a bit more control over the user experience in the case of a non-existent id. the filter would also work, but then you have "user logic" outside of the controller. filters should probably be for malicious or exceptional cases.
Matt Sherman
+2  A: 

I think You can get the articleId from the AuthorizationContext, so you don't need to pass it as a property of the attribute.

You can just do:

[CheckArticleExistence]
public ActionResult Tags(int articleId)
{
...
}
CD
+1  A: 

This one worked (thanks!):

[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))
     {
      ...
     }
    }
}
Wellington