在提交表单之前,防止转到另一个页面
本文关键字:另一个 表单 提交 | 更新日期: 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" }));
}
}
}