【问题标题】:Enforcing a choice prior to viewing MVC and Web Forms pages在查看 MVC 和 Web 表单页面之前强制执行选择
【发布时间】:2012-05-09 16:23:27
【问题描述】:

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

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

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

困扰我的主要问题是,要使用 MVC 进行重定向,我需要返回一个 RedirectResult,而这只能通过 Action 来完成。我不希望每个操作都包含有关此检查的代码 - 这似乎是基本控制器应该可以实现的那种事情(就像基本页面可能导致 Response.Redirect 一样。

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

【问题讨论】:

    标签: asp.net-mvc webforms response.redirect


    【解决方案1】:

    困扰我的主要问题是使用 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] 属性装饰要执行此检查的控制器/操作
    • 您将操作过滤器注册为global action filter,以便它绝对适用于所有操作
    • 您编写了一个custom filter provider,以便根据某些动态值将操作过滤器动态应用到某些操作(您可以访问 HttpContext)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2019-02-07
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多