我认为这很简单,但我有点挣扎。我正在为使用MVC 3的客户开发一个项目,该项目要求用户在使用该站点之前同意某些条件。我创建了一个标准的同意/不同意屏幕,该屏幕在首次进入网站时加载,但如果用户在网站的不同部分键入地址,他们可以绕过条件,例如www.test.com加载条件但是如果用户输入www.test.com/home,他们绕过条件。
如何确保他们在网站上的任何其他地方之前已经同意这些条件?我一直在尝试一个会话变量,我认为这是可行的方法,但是有没有办法在每个页面请求上检查这个变量而不必对网站上的每个Controller Action进行检查?
答案 0 :(得分:6)
您可以创建自定义属性并将其添加到Controller的顶部。
例如:
[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
答案 1 :(得分:1)
这个问题有两种方法:
如果这个条件改变了网站(比如StackOverflow的通知,显示在顶部),但是不要阻止你使用它,那么我认为它应该在表示逻辑中解决(因此在视图中,如果你有真正的观点而不仅仅是美化模板。)
在这种情况下,会话变量只是模型层状态的另一部分。当视图实例从模型层请求数据时,会通知它有用户的新通知。这意味着每个视图都能够将此通知的表示添加到当前响应中。优选地,通过选择使用一个附加模板,在组装输出时。此功能将在所有视图之间共享,因此可以在基类中实现,从而提供单个更改点。
如果对所有人都必须接受免责声明(例如在成人主题网站中“我18岁或以上”),那么在这种情况下,最佳选择是检查,如果用户已同意路由机制中的条件。我不确定您对ASP.NET MVC中的请求路由有多少控制权,但这又会为您提供单点更改。
如果在路由机制中做出决定,那也意味着你将条件完全置于标准MVC三元组之外。