2009-09-26 2 views
3

У меня есть дочерний класс AuthorizeAttribute с именем CheckArticleExistence.Custom AuthorizeAttribute

Я хотел бы установить атрибут, используя параметр, который я получаю в действии. Как это:

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

Я хочу использовать ArticleID, чтобы проверить, что статья существует в базе данных, и если это не могу вызвать что-то другое, используя метод OnAuthorization.

Есть ли способ? Спасибо.

+0

Это делается на этапе OnAuthorization? –

+0

Можете ли вы более четко узнать, что вы на самом деле хотите сделать с помощью статьи? –

ответ

3

Я думаю, что Вы можете получить ArticleID из AuthorizationContext, так что вам не нужно, чтобы передать его в качестве свойства атрибута.

Вы можете просто сделать:

[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

Да, согласен. Это, вероятно, было бы лучше всего сделать, чтобы быть честным. –

+0

Но это один из очевидных способов ... Я хотел бы использовать AuthorizeAttribute, потому что, если я решаю изменить способ обработки небытия статьи, мне не нужно изменять все действия, проверяющие, существует ли статья. В любом случае, спасибо – Wellington

+0

Надеюсь, у вашего репозитория всегда есть только один способ проверить. Вы можете изменить свою реализацию там. –

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)) 
     { 
      ... 
     } 
    } 
} 
Смежные вопросы