我试图这样做:
<body>
<div id="Page">
<div id="TopBar">
<div id="TopBarLogo">
<img src="@Url.Content("~/Content/images/Weblogo.png")" />
</div>
<div>
@{ Html.RenderAction("MenuPartial", "MenuPartial"); }
</div>
</div>
<div class="Content">
@if (SessionWrapper.IsAuthenticated)
{
@RenderBody()
}
else
{
Html.RenderPartial("AccessDeniedPartial");
}
</div>
</div>
</body>
</html>
但是,这是不允许的,因为我需要@RenderBody()或发生异常。 问题是这个解决方案会非常简洁,我仍然希望渲染页面的顶部,但我想覆盖内容,除非用户登录。
我能想到的唯一其他解决方案是在控制器中进行检查并返回另一个视图。问题是我必须在每个控制器中重复这个代码,这让我很难过。
有没有办法全局覆盖与上面类似的内容,而无需将用户重定向到另一个网址?如果有,请你给我一个正确方向的推动。我似乎有点陷入目前的心态。
我没有使用默认的Microsoft安全类(FormsAuthentication),在这种情况下也无法使用。
感谢。
答案 0 :(得分:1)
在Views / Shared文件夹中创建一个与AccessDenied
具有相同内容的AccessDeniedPartial
视图。
保持RenderBody
原样:
<div class="Content">
@RenderBody()
</div>
创建将检查身份验证的LogOnAuthorizeAttribute
,否则显示AccessDenied视图。
public class LogOnAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!SessionWrapper.IsAuthenticated)
{
filterContext.Result = new ViewResult {ViewName = "AccessDenied"};
}
else
{
base.OnAuthorization(filterContext);
}
}
}
如果您希望将LogOnAuthorizeAttribute
添加到每个控制器,请将其作为过滤器添加到GlobalFilterCollection
中的Global.asax
。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new LogOnAuthorizeAttribute());
}
答案 1 :(得分:0)
我能想到的唯一其他解决方案是在控制器中进行检查并返回另一个视图。
是的,
问题在于我必须在每个让我感到难过的控制器中重复这段代码。
不,如果您使用基于过滤器属性的mvc的新面向方面编程模型。检查Author.netAttribute和asp.net mvc的过滤器模型。
[Authorize]
public ViewResult MyAction(...)
您可以非常轻松地自定义此Authorize属性的行为。
此外,您可以在此处阅读有关面向方面编程的更多信息: http://en.wikipedia.org/wiki/Aspect-oriented_programming