在我的用户第一次注册后,我希望他们必须填写网站内的个人资料页面。我已经设置好了,如果他们之前没有填写过个人资料,它会在登录期间重定向他们,但是如果他们在网站内输入另一个 url,他们目前可以在重定向后自由地去任何他们想要的地方。
当用户尝试访问我网站上的任何页面直到他们完成个人资料时,要求他们访问个人资料页面的最佳方式是什么?
这是最好的做法:'如果(!用户已验证) - 重定向到配置文件页面'放置在每个控制器的顶部?有没有更优雅的解决方案?
在我的用户第一次注册后,我希望他们必须填写网站内的个人资料页面。我已经设置好了,如果他们之前没有填写过个人资料,它会在登录期间重定向他们,但是如果他们在网站内输入另一个 url,他们目前可以在重定向后自由地去任何他们想要的地方。
当用户尝试访问我网站上的任何页面直到他们完成个人资料时,要求他们访问个人资料页面的最佳方式是什么?
这是最好的做法:'如果(!用户已验证) - 重定向到配置文件页面'放置在每个控制器的顶部?有没有更优雅的解决方案?
从实现自定义动作过滤器(IActionFilter)开始:
public class ProfileRequiredActionFilter : IActionFilter
{
#region Implementation of IActionFilter
public void OnActionExecuting(ActionExecutingContext filterContext)
{
//TODO: Check if the Authenticated User has a profile.
//If Authenicated User doesn't have a profile...
filterContext.Result = new RedirectResult("Path-To-Create-A-Profile");
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
#endregion
}
然后在 Global.asax的RegisterGlobalFilters方法中全局注册 Action Filter ...
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ProfileRequiredActionFilter());
}
注意:如果您不希望全局应用此过滤器,则可以创建一个 ActionFilterAttribute 并将其应用于控制器和/或操作方法...
public class ProfileRequiredAttribute : ActionFilterAttribute
{
#region Implementation of IActionFilter
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
//TODO: Check if the Authenticated User has a profile.
//If Authenicated User doesn't have a profile...
filterContext.Result = new RedirectResult("Path-To-Create-A-Profile");
}
#endregion
}
您可以创建一个 Base 控制器并让您的所有其他控制器继承自该控制器。然后在其中有一个 OnActionExecuting 方法,例如......
protected override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
// If the user has not filled out their profile, redirect them
if(CurrentUser != null && !CurrentUser.IsVerified)
{
context.Result = new RedirectResult("/User/Profile/" + CurrentUser.ID);
}
}