C# 如何将路由数据从ActionFilterAttribute传递到action方法?
如果会话已过期,我将使用C# 如何将路由数据从ActionFilterAttribute传递到action方法?,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,如果会话已过期,我将使用ActionFilterAttribute将用户路由到登录视图,如下所示 现在,我想保留原始请求中的路由数据,以便在登录后将用户路由回该视图 如何将原始路线数据发送到登录操作方法 public class BaseController : Controller { public int? BranchId {get => HttpContext.Session.GetInt32("BranchId") as int?;} public string
ActionFilterAttribute
将用户路由到登录视图,如下所示
现在,我想保留原始请求中的路由数据,以便在登录后将用户路由回该视图
如何将原始路线数据发送到登录
操作方法
public class BaseController : Controller
{
public int? BranchId {get => HttpContext.Session.GetInt32("BranchId") as int?;}
public string Admin {get => HttpContext.Session.GetString("Admin") as string;}
public BaseController() {}
}
public class AdminOrBranchesAccessAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
if ((context.Controller as BaseController).Admin == null &&
(context.Controller as BaseController).BranchId == null)
{
context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Home",
action = "Login"
}));
}
}
}
[AdminOrBranchesAccess]
public async Task<IActionResult> Details(int? id)
{
// Some stuff going on
return View();
}
公共类BaseController:控制器
{
public int?BranchId{get=>HttpContext.Session.GetInt32(“BranchId”)作为int?;}
公共字符串Admin{get=>HttpContext.Session.GetString(“Admin”)作为字符串;}
公共BaseController(){}
}
公共类管理员牧场访问属性:ActionFilterAttribute
{
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
base.OnActionExecuting(上下文);
if((context.Controller作为BaseController).Admin==null&&
(context.Controller作为BaseController).BranchId==null)
{
context.Result=新的RedirectToRouteResult(新的RouteValueDictionary(新的
{
controller=“Home”,
action=“登录”
}));
}
}
}
[AdminOrBranchesAccess]
公共异步任务详细信息(int?id)
{
//发生了什么事
返回视图();
}
要在成功登录后重新选择上一个操作,您需要为登录操作提供返回url,并在OnActionExecuting
中设置其值
returnUrl
[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> Login(string returnUrl = null)
{
// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
ViewData["ReturnUrl"] = returnUrl;
return View();
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return RedirectToLocal(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToAction(nameof(Lockout));
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
public class AdminOrBranchesAccessAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
if ((context.Controller as BaseController).Admin == null &&
(context.Controller as BaseController).BranchId == null)
{
context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Home",
action = "Login",
returnUrl = context.HttpContext.Request.Path
}));
}
}
}
如果要使用重定向,则必须将该数据存储在会话中,或者将其返回给客户端,并让客户端在下一个请求时将其发送回。这是HTTP限制,不是MVC限制。@KennethK。如何在会话中存储它?是否有某种方法可以在一个地方为整个应用程序执行此操作,或者我必须在每个控制器方法中执行此操作?我无权访问
OnActionExecuting
-类中的HttpContext
。