【发布时间】:2020-11-04 11:52:34
【问题描述】:
我正在尝试在我的 aspnetcore 应用程序中实现“returnUrl”功能,但我正在努力寻找一种将参数动态传递给操作的方法。
流程是这样的:
- 用户已将 URL
https://localhost:44358/Secure/VisualizationFiles?viz=vizFilePlays加入书签 - 网站检查他们是否已登录,如果未登录,则将他们重定向到 Home 控制器的
Login操作以登录(通过 returnUrl) - 登录后,用户被重定向到上面最初请求的 URL,包括任何 URL 参数
目前 Secure 控制器方法使用ActionFilterAttribute 拦截传入的 HTTP 请求并确保控制器;动作和参数作为 returnUrl 传递(或 reRoute 在这种情况下)
public class NimsAuthenticationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var url = filterContext.RouteData.Values["Controller"] + "/" + filterContext.RouteData.Values["Action"] + "?" + QueryString(filterContext.ActionArguments);
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Home" }, { "action", "Index" }, { "reRoute", url } });
base.OnActionExecuting(filterContext);
}
private string QueryString(IDictionary<string, object> dict)
{
var list = new List<string>();
foreach (var item in dict)
{
list.Add(item.Key + "=" + item.Value);
}
return string.Join("&", list);
}
}
在用户被重定向(从安全控制器)到 Home 控制器后,我们会传递完整的returnUrl(即reRoute URL)
如您所见,现在我正在做一些容易出错的字符串操作来提取Controller; Action 和 url params 来自 reRoute 字符串。我想知道:
- 有没有办法可以将整个
reRouteurl 传递给Redirect? - 如果上述方法不可行,是否有另一种方法来处理重定向,使其成为动态的(即 url 参数以及控制器和操作将不同)
【问题讨论】:
-
当您使用Redirect(而不是
RedirectToAction)和reRoute作为参数时会发生什么? -
我确实尝试过,但这使得我试图重定向到同一个控制器中的操作的 aspnetcore 东西 -
https://localhost:44358/Home/Secure/VisualizationFiles?viz=vizFilePlays -
你能试试
return Redirect("/" + reRoute);吗?/应该使它使用根 url。 -
@JayFridge 成功了! :D 我不敢相信它是如此简单。非常感谢!请添加为答案,我将接受您的评论作为解决方案。
标签: c# asp.net asp.net-core