使用属性路由参数为其他属性 [英] Use attribute routing parameters for other attributes

查看:134
本文介绍了使用属性路由参数为其他属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用属性路由(MVC)来调用控制器方法,也是一种Authorizationattribute定制属性:

  [路线({ID:INT})]
[USERAUTH(专案编号= 3)]
公众的ActionResult选择(INT ID){
    返回JsonGet(Magic.DoSomethingMagic());
}

USERAUTH只是一个简单AuthorizationAttribute:

 公共类UserAuthAttribute:AuthorizeAttribute {
    公众诠释专案编号{获取;设置;}
    保护覆盖布尔AuthorizeCore(HttpContextBase contextBase){
        VAR currentProject =新项目(专案编号);
        返回currentProject.UserIsMember()
    }
}

现在我想与为专案编号参数使用。下面code 不起作用,但应该显示我想达到什么(我不能只是添加ID)

  [路线({ID:INT})]
[USERAUTH(专案编号= ID)]
公众的ActionResult选择(INT ID){
    返回JsonGet(Magic.DoSomethingMagic());
}


解决方案

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

你的行动看起来像

  [路线({ID:INT})]
        [USERAUTH]
        公众的ActionResult选择(INT ID)
        {
            返回查看();
        }

和您的属性类中,你可以得到路由值。

 公共类UserAuthAttribute:AuthorizeAttribute
    {
        公众诠释专案编号{搞定;组; }
        保护覆盖布尔AuthorizeCore(HttpContextBase contextBase)
        {
            VAR getRouteData = contextBase.Request.RequestContext.RouteData.Values​​ [ID];
            如果(getRouteData!= NULL)
            {
                专案编号= Int32.Parse(getRouteData.ToString());
            }
            如果(专案编号→5)
            {
                返回true;
            }
            其他
            {
                返回false;
            }
        }
    }

I use Attribute Routing (MVC) to call Controller Methods and also an Authorizationattribute with custom Properties:

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

UserAuth is just a simple AuthorizationAttribute:

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

Now I want to use this with a parameter for the projectId. The following code does not work but should show what I want to achieve (I cannot just add the id)

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

解决方案

you don't need to pass id from your AuthorizationAttribute. you can get it from request.

your action will look like

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

And inside your attribute class, you can get route values.

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;
            }           
        }
    }

这篇关于使用属性路由参数为其他属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆