2012-05-09 21 views
0

我的工作,需要知道用户的选择,他们进入网站之前的系统上选择。到目前为止,选择已存储在cookie中,并通过页面加载的JavaScript进行检查 - 如果cookie不存在,则会显示一个对话框并由用户进行选择。强制执行前观看MVC和Web窗体页

虽然我们通常希望用户在应用程序的主页到达时,他们可以合法地跟在一个URL到应用程序中的任何网页,所以JavaScript来检查每个网页上不存在选择。

这造成的问题(几乎总是通过清除饼干固定的),所以我们切换到存储在数据库中的选择。我们需要的是确保所有页面(MVC和Web窗体)都检查选择是否已经完成,如果没有,则显示对话框或重定向到可以进行选择的页面。

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

任何人都可以建议为所有页面对数据库进行检查,然后要么导致重定向或显示一个对话框好办法?

回答

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]属性检查
  • 你,使之适用于所有绝对行动
  • 你为了写一个custom filter provider到DYNA注册的动作过滤器作为global action filter根据一些动态值(可以访问HttpContext)将动作过滤器应用于某些动作。