在提交表单之前,防止转到另一个页面

本文关键字:另一个 表单 提交 | 更新日期: 2023-09-27 18:11:36

在我的项目中,我有一个功能,每当有一个新用户创建,他登录到帐户,他必须首先更改密码。

所以如果用户是新的,我在登录后首先显示ChangePassowrd屏幕。菜单中只存在ChangePassowrd和LogOut选项。

现在假设他输入了一些只有用户修改密码才能访问的网站url,这是不允许的。有人知道我怎么实现它吗?我现在知道了。卸载,但它不工作,如果url是直接粘贴。在服务器端,我有一个BaseController,在任何控制器之前调用(但在控制器的构造函数调用之后)进行初始化。我试图改变RouteData。价值观,但它不起作用。它抛出404未找到错误。代码如下:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
  if (requestContext != null)
  {
    base.Initialize(requestContext);
    if (Convert.ToString(requestContext.HttpContext.Session["UserType"]) == "3")
    {
      requestContext.RouteData.Values["controller"] = "Login";
      requestContext.RouteData.Values["action"] = "ChangePassword";
    }
  }
}

在提交表单之前,防止转到另一个页面

你可以在用户模型中插入一个新属性,这意味着扩展asp.net身份模型,并让这个新属性类似于public bool passwordChanged {get;设置;}检查此属性,除非更改密码,否则不允许访问。

您可以通过这种方式实现这一点。

AppStart/FilterConfig.cs文件中添加

filters.Add(new ChangePasswordRequiredActionFilter());

现在,您必须为该过滤器添加实现。您可以在global.asax文件或任何您想要的地方进行:

public class ChangePasswordRequiredActionFilter: IActionFilter
{
    #region Implementation of IActionFilter
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string currentUrl = HttpContext.Current.Request.Url.AbsolutePath;
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            //Now you have to put your custom logic here, this is example:
            User user = ourService.GetUser(blablabla);
            if (user != null && !user.ChangePassword)
            {
                if (currentUrl != "/Account/ChangePassword" && currentUrl != "/Account/LogOff")
                {
                    filterContext.Result = new RedirectResult("/Account/ChangePassword");
                }
            }
        }
    }
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }
    #endregion
}

此解决方案确保您将检查每个用户请求服务器的条件。

只需将用户状态设置为"未登录",直到用户同时登录并更改密码。

如果这个问题是针对某种技术的,那么从提问的方式来看,这个问题并不明显。

对于你想要的这个功能,你必须在你的web应用中创建一个自定义过滤器,就像下面给出的那样…

 public class ChangePasswordAttribute : ActionFilterAttribute
 {
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
            //Check user has changed password or not 
             if(--yes--){ nothing to do }
             else{ GoToChangePasswordPage(filterContext); }
             return;
    }
    private static void GoToChangePasswordPage(ActionExecutingContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
              new RouteValueDictionary 
            { 
                { "controller", "Login" }, 
                { "action", "ChangePassword" } 
            });
    }
 }

有关如何在asp.net mvc中构建自定义过滤器的更多帮助,请访问..1) http://www.dotnetcurry.com/showarticle.aspx?ID=976

2) http://sampathloku.blogspot.in/2013/03/how-to-create-custom-action-filter-for.html

最后,我用以下代码在BaseController中解决它:我认为这是更简单的版本。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
  if (filterContext != null)
  {
    if (Session["UserType"] != null && Convert.ToString(Session["UserType"]) == "3") // New User
    {
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "ChangePassword", controller = "Login" }));
    }
  }
}