在查看MVC和Web窗体页面之前执行选择

时间:2012-05-09 16:23:28

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

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

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

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

困扰我的主要事情是,要使用MVC进行重定向,我需要返回RedirectResult,这只能通过Action完成。我不希望每个操作都有关于此检查的代码 - 似乎应该可以从基本控制器那样的事情(与基页可能导致Response.Redirect的方式相同。

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

1 个答案:

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