0

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

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

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

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

任何人都可以建议所有页面对数据库执行检查然后导致重定向或显示对话框的好方法吗?

4

1 回答 1

2

困扰我的主要问题是,要使用 MVC 进行重定向,我需要返回一个 RedirectResult,而这只能通过 Action 来完成。

哦,一点也不。您还可以从自定义操作过滤器重定向。

例如,您可以编写一个自定义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)。
于 2012-05-09T16:43:57.213 回答