Asp.net mvc 在查看MVC和Web表单页面之前强制执行选择

Asp.net mvc 在查看MVC和Web表单页面之前强制执行选择,asp.net-mvc,webforms,response.redirect,Asp.net Mvc,Webforms,Response.redirect,我正在开发一个系统,在用户进入网站之前需要知道用户的选择。到目前为止,该选项已存储在cookie中,并在页面加载时由JavaScript进行检查-如果cookie不存在,则会显示一个对话框,用户进行选择 虽然我们通常期望用户到达应用程序的主页,但他们可以合法地跟踪应用程序中任何页面的URL,因此检查选择的JavaScript存在于每个页面上 这导致了一些问题(几乎总是通过清除cookies来解决),因此我们切换到将选择存储在数据库中。我们需要的是一种简洁的方式,确保所有页面(MVC和Web表单)

我正在开发一个系统,在用户进入网站之前需要知道用户的选择。到目前为止,该选项已存储在cookie中,并在页面加载时由JavaScript进行检查-如果cookie不存在,则会显示一个对话框,用户进行选择

虽然我们通常期望用户到达应用程序的主页,但他们可以合法地跟踪应用程序中任何页面的URL,因此检查选择的JavaScript存在于每个页面上

这导致了一些问题(几乎总是通过清除cookies来解决),因此我们切换到将选择存储在数据库中。我们需要的是一种简洁的方式,确保所有页面(MVC和Web表单)检查是否已做出选择,如果没有,则显示一个对话框或重定向到可以做出选择的页面

困扰我的主要问题是,要使用MVC进行重定向,我需要返回一个
重定向结果
,而这只能通过一个操作来完成。我不希望每个操作都有与此检查相关的代码-这似乎是基本控制器应该能够实现的事情(与基本页可能导致
响应的方式相同。重定向

有谁能建议一种好方法,让所有页面对数据库执行检查,然后导致重定向或显示对话框

困扰我的主要问题是,使用MVC进行重定向时,我 需要返回重定向结果,并且只能从 行动

哦,一点也不。你也可以从自定义重定向

例如,您可以编写一个自定义的
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]
    属性装饰要执行此检查的控制器/操作
  • 将操作筛选器注册为,以便它完全应用于所有操作
  • 您可以编写一个脚本,以便基于某些动态值(您可以访问HttpContext)将操作筛选器动态应用于某些操作