2012-07-06 44 views
0

我正在创建一个带有Windows身份验证的MVC Intranet应用程序。被访问的数据是特定年份的,所以我需要一种方法来设置一个全局变量,无论是否是会话,或其他什么,必须在执行任何查询之前设置。MVC3“全局变量”

我一直无法找到一种方法来强制用户登录,因为他们已经通过他们的Windows登录凭据授权,所以使用属性强制登录似乎有问题。

我发现用户可以导航到任何特定的页面,并尝试拉取数据,并创建一个没有定义年份的破坏。

我想要做的是强制用户选择年份选择页面,选择他们希望访问的年份,如果年份变量尚未设置。

我查看了相关的问题,他们似乎没有提供我目前遇到的难题的答案。

+0

_I've没有能够找到一种方法来强制用户登录,因为他们已授权通过自己的窗口,以便使用属性强制登录登录凭据似乎problematic_ - 的'[授权]'属性仍适用。他们将被提示登录,如果他们没有被授权或不属于所需的组。 – jrummell 2012-07-06 14:47:26

+0

我对特定组有特定操作,但Intranet上的所有用户都可以查看访问权限。 [授权]属性似乎并没有阻止用户访问任何页面和操作。因此,如果他们能够访问我们域中的用户,那么登录名是如何被强制的?我对MVC还是比较新的,所以我可能很容易错过很多。 – Erik 2012-07-06 14:59:51

+0

您可能错过了['Roles'](http://msdn.microsoft.com/zh-cn/library/system.web.mvc.authorizeattribute.roles(v = vs.98).aspx)属性。 – jrummell 2012-07-06 15:03:47

回答

1

你可以编写一个自定义的ActionFilter,它放在你的所有控制器上(当然不是你必须选择年份的动作)。如果未选择年份,则您将重定向到您可以选择年份的控制器/操作。

public class CheckYearAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(<YEAR IS NOT SET>)//redirect 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary {{ "Controller", "YourController" }, 
             { "Action", "YourAction" } }); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 
+0

谢谢你。这看起来不错,看看是否设定了一年,但我应该用什么来设定年?一个ViewBag对象?会话变量?谢谢! – Erik 2012-07-06 15:02:10

+0

@Erik是的,会话会很好。 – 2012-07-06 15:05:15

+0

非常感谢您的帮助。 – Erik 2012-07-06 15:11:28