如何从 returnUrl 中排除一些操作方法
How to exclude some action methods from returnUrl
我正在使用 returnUrl 到 return 在因不活动而注销后登录时上次请求的页面。这本身就可以正常工作,除非用户不请求页面,而是请求其他操作。我想要的是,如果 SessionTimeOut 之后的第一个操作是 "addItem",returnUrl 设置为 "controller/index" 而不是 "controller/addItem"。
在 SessionTimeOut 之后,应用程序不会自动重定向到登录页面。一旦用户在 SessionTimeOut 之后发出新请求(根据客户端的请求),重定向就会发生。因此,当用户单击菜单项时,returnUrl 将设置为请求的页面。到目前为止很棒。
问题是当用户单击例如 returnUrl 被设置为链接到该按钮的操作方法的 addItem 按钮时。我不明白如何从 returnUrl.
中排除这种方法
这是一个非常缩小的应用程序示例,以了解它是如何组合在一起的。
主控制器:
public ActionResult MainPage(){
return View();
}
public ActionResult addItem(){
--- Do Something ---
}
public ActionResult SecondPage(){
return View();
}
登录方式:
public ActionResult Login([Binde(Include = "UserName, Password")]LoginModel model, string returnUrl)
{
if(Modelstate.IsValid)
{
--- Do Validation ---
return Redirect(returnUrl);
}
}
如果用户在 MainPage 上并在 SessionTimeOut 之后发出对 "SecondPage" 的请求,returnUrl 应该是 "controller/SecondPage"。(确定)
如果用户在主页上并在 SessionTimeOut 之后发出对 "addItem" 的请求,returnUrl 应该是 "controller/MainPage" 而不是 "controller/addItem"
一个快速的解决方案 是使操作过滤器生效。
您可能知道,动作过滤器是一个属性,您可以将其应用于控制器动作——或整个控制器——它修改动作执行的方式。更多详细信息,请参阅文档 here
在这种情况下,您需要重写OnActionExecuting方法,在执行控制器动作之前调用,以便在执行之前,您可以根据return值决定是否重定向。
我给你举个简单的例子:
public class myCheckUrlActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
List<string> avoidList = new List<string> { "addItem", "removeItem"};
foreach(string i in avoidList)
{
if(filterContext.HttpContext.Request.Url.Query.Contains(i))
{
filterContext.Result = new RedirectResult("/Home/MainPage") ;
break;
}
}
}
}
现在,让我们将此过滤器应用于家庭控制器内的所有操作方法,尽管您可以将它单独应用于某些操作方法。
[myCheckUrlActionFilter]
public class HomeController : Controller
{ .... }
访问过滤器主体内的 HttpContext,可以提取会话,甚至当前控制器和操作名称。因此,您可以在此处检查会话状态 returnUrl 是否存在,以进一步决定重定向。所以,根据需要自定义它。
希望这对您有所帮助。
我正在使用 returnUrl 到 return 在因不活动而注销后登录时上次请求的页面。这本身就可以正常工作,除非用户不请求页面,而是请求其他操作。我想要的是,如果 SessionTimeOut 之后的第一个操作是 "addItem",returnUrl 设置为 "controller/index" 而不是 "controller/addItem"。
在 SessionTimeOut 之后,应用程序不会自动重定向到登录页面。一旦用户在 SessionTimeOut 之后发出新请求(根据客户端的请求),重定向就会发生。因此,当用户单击菜单项时,returnUrl 将设置为请求的页面。到目前为止很棒。 问题是当用户单击例如 returnUrl 被设置为链接到该按钮的操作方法的 addItem 按钮时。我不明白如何从 returnUrl.
中排除这种方法这是一个非常缩小的应用程序示例,以了解它是如何组合在一起的。
主控制器:
public ActionResult MainPage(){
return View();
}
public ActionResult addItem(){
--- Do Something ---
}
public ActionResult SecondPage(){
return View();
}
登录方式:
public ActionResult Login([Binde(Include = "UserName, Password")]LoginModel model, string returnUrl)
{
if(Modelstate.IsValid)
{
--- Do Validation ---
return Redirect(returnUrl);
}
}
如果用户在 MainPage 上并在 SessionTimeOut 之后发出对 "SecondPage" 的请求,returnUrl 应该是 "controller/SecondPage"。(确定)
如果用户在主页上并在 SessionTimeOut 之后发出对 "addItem" 的请求,returnUrl 应该是 "controller/MainPage" 而不是 "controller/addItem"
一个快速的解决方案 是使操作过滤器生效。 您可能知道,动作过滤器是一个属性,您可以将其应用于控制器动作——或整个控制器——它修改动作执行的方式。更多详细信息,请参阅文档 here
在这种情况下,您需要重写OnActionExecuting方法,在执行控制器动作之前调用,以便在执行之前,您可以根据return值决定是否重定向。
我给你举个简单的例子:
public class myCheckUrlActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
List<string> avoidList = new List<string> { "addItem", "removeItem"};
foreach(string i in avoidList)
{
if(filterContext.HttpContext.Request.Url.Query.Contains(i))
{
filterContext.Result = new RedirectResult("/Home/MainPage") ;
break;
}
}
}
}
现在,让我们将此过滤器应用于家庭控制器内的所有操作方法,尽管您可以将它单独应用于某些操作方法。
[myCheckUrlActionFilter]
public class HomeController : Controller
{ .... }
访问过滤器主体内的 HttpContext,可以提取会话,甚至当前控制器和操作名称。因此,您可以在此处检查会话状态 returnUrl 是否存在,以进一步决定重定向。所以,根据需要自定义它。
希望这对您有所帮助。