在提交表单之前禁止转到另一页

时间:2014-07-05 07:11:17

标签: c# javascript jquery asp.net-mvc asp.net-mvc-5

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

因此,如果用户是新用户,我会在登录后首先显示ChangePassowrd屏幕。菜单只有ChangePassowrd和LogOut选项。

现在,如果他输入一些只有在用户更改密码后才能访问的网站网址,则不允许这样做。有谁知道我如何实现它?我知道widnow.unload但如果直接粘贴url它不起作用。 在服务器端,我有一个BaseController,它在任何控制器之前调用(但在调用控制器的构造函数之后)进行初始化。我试图更改RouteData.Values但它没有工作。它抛出错误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";
    }
  }
}

6 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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";
            }
        }
    }
}

答案 2 :(得分:0)

你可以通过这种方式实现这一目标。

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
}

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

对于此功能,您希望您必须在ur 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中构建自定义过滤器的更多帮助,请访问.. 1。)http://www.dotnetcurry.com/showarticle.aspx?ID=976

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

答案 5 :(得分:0)

最后,经过尝试,我使用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" }));
    }
  }
}