.NET CORE中通过ActionFilterAttribute访问会话

时间:2019-07-16 12:11:05

标签: .net-core asp.net-core-2.1

我尝试使用.NET CORE中的ActionFilterAttribute访问会话值。因此,我使用以下代码:

获取注释[SessionCheck]的普通.NET Core控制器。

[SessionCheck]
public class HomeController : Controller
{
}

这些类由ActionFilterAttribute类扩展,并且覆盖了我要访问会话值的OnActionExecuted方法。有可能吗?我只能访问密钥,而不能访问会话值。

public class SessionCheck:ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var session = context.HttpContext.Session;
        //var mySessionValue = session["user"];
    }
}

我的主要问题是,我有一个会话值,该值描述了我必须将请求路由到何处。如果其中有一个特殊值,我想将我的请求路由到位置A,否则路由到位置B。

还有另一种可能性吗?

2 个答案:

答案 0 :(得分:2)

我有同样的问题,您可以执行以下操作:

@Attr1=sql:variable(@someParam)

答案 1 :(得分:0)

public class SessionCheck : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
    {
        if (actionExecutingContext.HttpContext.Session.GetString("user") == "User One")
        {
            actionExecutingContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "LocationA Controller",
                action = "LocationA Action",
                returnurl = Microsoft.AspNetCore.Http.Extensions.UriHelper.GetEncodedUrl(actionExecutingContext.HttpContext.Request)
            }));
        }
        else
        {
            actionExecutingContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "LocationB Controller",
                action = "LocationB Action",
                returnurl = Microsoft.AspNetCore.Http.Extensions.UriHelper.GetEncodedUrl(actionExecutingContext.HttpContext.Request)
            }));
        }
    }
}

如上所述编写SessionCheck类,您可以通过在要设置的位置键入HttpContext.Session.SetString("user", "User One");来设置特殊值,也可以像上面一样使用多个if-elseif,这在< strong> .Net Core 3.1 。