我正在研究一个在进入网站之前需要了解用户选择的系统。到目前为止,选择已存储在cookie中并在页面加载时由JavaScript检查 - 如果cookie不存在,则会显示一个对话框,用户可以选择。
虽然我们通常希望用户到达应用程序的主页,但他们可以合法地跟踪应用程序中任何页面的URL,因此每个页面上都存在用于检查选择的JavaScript。
这导致了问题(几乎总是通过清除cookie来修复),因此我们将切换到将选择存储在数据库中。我们需要的是一种简洁的方法,确保所有页面(MVC和Web窗体)检查已做出选择,如果没有,则显示对话框或重定向到可以进行选择的页面。
困扰我的主要事情是,要使用MVC进行重定向,我需要返回RedirectResult
,这只能通过Action完成。我不希望每个操作都有关于此检查的代码 - 似乎应该可以从基本控制器那样的事情(与基页可能导致Response.Redirect
的方式相同。
任何人都可以建议所有页面对数据库执行检查的好方法,然后导致重定向或显示对话框吗?
答案 0 :(得分:2)
困扰我的主要事情是使用MVC引起重定向,我 需要返回一个RedirectResult,这只能从一个 动作。
哦,根本不是。您还可以从自定义action filters重定向。
例如,您可以编写一个自定义IAuthorizationFilter
来检查用户是否做出了必要的选择,如果没有重定向到某个给定的页面。可以对cookie,数据库或您决定保留此信息的任何地方进行检查:
public class EnsureChoiceHasBeenMadeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
// get the current user
var user = filterContext.HttpContext.User;
if (user.Identity.IsAuthenticated && !UserMadeAChoice(user.Identity.Name))
{
// if the current user is authenticated and he didn't made a choice
// redirect him to some page without even attempting to execute
// the controller action that he requested
var values = new RouteValueDictionary(new
{
controller = "home",
action = "index"
});
filterContext.Result = new RedirectToRouteResult(values);
}
}
private bool UserMadeAChoice(string username)
{
throw new NotImplementedException();
}
}
现在你有不同的可能性:
[EnsureChoiceHasBeenMade]
属性