将属性路由参数用于其他属性

时间:2016-02-25 16:53:12

标签: c# asp.net-mvc asp.net-mvc-5 attributes custom-attributes

我使用属性路由(MVC)来调用控制器方法,还使用自定义属性的Authorization属性:

[Route("{id:int}")]
[UserAuth(ProjectId=3)]
public ActionResult Select(int id) {  
    return JsonGet(Magic.DoSomethingMagic());
}

UserAuth只是一个简单的AuthorizationAttribute:

public class UserAuthAttribute:AuthorizeAttribute {
    public int ProjectId { get;set;}
    protected override bool AuthorizeCore(HttpContextBase contextBase) {
        var currentProject=new Project(ProjectId);
        return currentProject.UserIsMember()
    }       
}

现在我想将它与projectId的参数一起使用。以下代码不起作用但应显示我想要实现的内容(我不能只添加ID)

[Route("{id:int}")]
[UserAuth(ProjectId=id)]
public ActionResult Select(int id) {  
    return JsonGet(Magic.DoSomethingMagic());
}

1 个答案:

答案 0 :(得分:2)

您不需要从AuthorizationAttribute传递ID。你可以从要求得到它。

您的行为将如下所示

 [Route("{id:int}")]
        [UserAuth]
        public ActionResult Select(int id)
        {
            return View();
        }

在属性类中,您可以获取路线值。

public class UserAuthAttribute: AuthorizeAttribute
    {
        public int ProjectId { get; set; }
        protected override bool AuthorizeCore(HttpContextBase contextBase)
        {
            var getRouteData =contextBase.Request.RequestContext.RouteData.Values["id"];
            if(getRouteData != null)
            {
                ProjectId = Int32.Parse(getRouteData.ToString());
            }
            if(ProjectId > 5)
            {
                return true;
            }
            else
            {
                return false;
            }           
        }
    }