2

我认为这会很简单,但我有点挣扎。我正在为使用 MVC 3 的客户开发一个项目,该项目要求用户在使用该站点之前同意某些条件。我创建了一个标准的同意/不同意屏幕,该屏幕在首次进入网站时加载,但如果用户键入网站不同部分的地址,他们可以绕过条件,例如 www.test.com 加载条件但如果用户键入 www.test.com/home 他们绕过条件。

我怎样才能确保他们已经同意这些条件,然后他们才能到达网站上的其他任何地方?我一直在尝试一个会话变量,我认为这是要走的路,但是有没有办法在每个页面请求上检查这个变量,而不必在网站上的每个控制器操作中写入检查?

4

2 回答 2

6

您可以创建一个自定义属性并将其添加到控制器的顶部。

例如:

    [AgreedToDisclaimer]
    public ActionResult LoadPage()
    {
         return View();
    }

只有在 AgreedToDisclaimer 返回 true 时才会加载视图。

public class AgreedToDisclaimerAttribute : AuthorizeAttribute
{

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
       if (httpContext == null)
        throw new ArgumentNullException("httpContext");

       // logic to check if they have agreed to disclaimer (cookie, session, database)
       return true;
    }

   protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
   {
          // Returns HTTP 401 by default - see HttpUnauthorizedResult.cs.
           filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary 
            {
             { "action", "ActionName" },
             { "controller", "ControllerName" },
             { "parameterName", "parameterValue" }
            });
   }
}

http://msdn.microsoft.com/en-us/library/dd410209(v=vs.90).aspx

http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.handleunauthorizedrequest.aspx

于 2012-08-15T10:56:28.577 回答
1

该问题有两种方法:

  • 如果这种情况改变了站点(如 StackOverflow 的通知,显示在顶部),但不阻止您使用它,那么我认为它应该在表示逻辑中解决(因此在视图中,如果您有真实视图而不是只是美化模板)。

    在这种情况下,会话变量只是模型层状态的另一部分。当视图实例从模型层请求数据时,它会被告知有新的通知给用户。这意味着每个视图都可以将这个通知的表示添加到当前响应中。最好在组合输出时选择使用一个额外的模板。此功能将在所有视图之间共享,因此可以在基类中实现,提供一个单点更改。

  • If this acceptance of disclaimer is mandatory for everyone (like "I am 18 or older" in adult-themed sites), then the best option, in this case, would be to check, if user has agreed to condition in the routing mechanism. I am not sure how much control you have over request routing in ASP.NET MVC, but that again would provide you with as single point of change.

    If decision is made in routing mechanism, it would also mean, that you put the condition outside the standard MVC triad entirely.

于 2012-08-16T06:52:14.837 回答