C# 在提交表单之前,禁止转到其他页面

C# 在提交表单之前,禁止转到其他页面,c#,javascript,jquery,asp.net-mvc,asp.net-mvc-5,C#,Javascript,Jquery,Asp.net Mvc,Asp.net Mvc 5,在我的项目中,我有一个功能,每当有新用户创建并登录到该帐户时,他必须首先更改密码 所以,若用户是新用户,我会在登录后首先显示ChangePassowrd屏幕。菜单仅存在ChangePassowrd和注销选项 现在,如果他输入了网站的某个url,而该url只有在用户更改密码后才能访问,则是不允许的。有人知道我如何实现它吗?我知道widnow.unload,但如果url是直接粘贴的,它就不起作用。 在服务器端,我有一个BaseController,它在任何控制器之前调用,但在控制器的构造函数调用初始

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

所以,若用户是新用户,我会在登录后首先显示ChangePassowrd屏幕。菜单仅存在ChangePassowrd和注销选项

现在,如果他输入了网站的某个url,而该url只有在用户更改密码后才能访问,则是不允许的。有人知道我如何实现它吗?我知道widnow.unload,但如果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;set;}
检查此属性,除非更改密码,否则不允许访问

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

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext != null && filterContext.HttpContext.Session["UserType"] != null)
        {
            if (Convert.ToString(filterContext.HttpContext.Session["UserType"]) == "3")
            {
                filterContext.RouteData.Values["controller"] = "Login";
                filterContext.RouteData.Values["action"] = "ChangePassword";
            }
        }
    }
}
在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
}

此解决方案可确保您在向服务器发出的每个用户请求中检查您的条件。

只需将用户状态设置为“未登录”,直到用户登录并更改密码


如果这个问题是特定于某项技术的,从提问的方式来看并不明显。

对于你想要的功能,你必须在你的webapp中制作一个自定义过滤器,如下所示

 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中构建自定义筛选器的更多帮助,请访问。。 一,


2.

最后,在尝试之后,我用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" }));
    }
  }
}

我认为这在客户端是不可能的。用户只需通过url打开新选项卡,就可以进行服务器端检查。您不能只使用控制器代码吗?其余的文件呢?如果您只想在前端执行,这是不可能的。您必须使用服务器端。@mo.esmp ok。但是我如何在服务器端实现它呢?我不能在这里获得会话。什么会话?这里不使用会话。您只需对请求系统变量进行操作,不知道发生了什么问题。