gpt4 book ai didi

c# - 在不重定向 MVC3 中的用户的情况下覆盖 RenderBody 内容

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:30 27 4
gpt4 key购买 nike

我正在尝试这样做:

<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() 否则会发生异常。问题是这个解决方案太简洁了,我仍然想呈现页面的顶部,但我想覆盖内容,除非用户已登录。

我能想到的唯一其他解决方案是在 Controller 中进行检查并返回另一个 View 。这样做的问题是我必须在每个 Controller 中重复这段代码,这让我很难过。

有什么方法可以全局覆盖类似于上面的内容,而不会将用户重定向到另一个 url?如果有的话,请你给我一个正确的方向。我似乎有点拘泥于目前的心态。

我没有使用默认的 Microsoft 安全类 (FormsAuthentication),在这种情况下我也无法使用。

谢谢。

最佳答案

在 Views/Shared 文件夹中创建一个 AccessDenied View ,其内容与您的 AccessDeniedPartial 相同。保留 RenderBody 原样:

<div class="Content">
@RenderBody()
</div>

创建一个 LogOnAuthorizeAttribute 来检查身份验证,否则显示 AccessDenied View 。

public class LogOnAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!SessionWrapper.IsAuthenticated)
{
filterContext.Result = new ViewResult {ViewName = "AccessDenied"};
}
else
{
base.OnAuthorization(filterContext);
}
}
}

如果您希望将 LogOnAuthorizeAttribute 添加到每个 Controller ,请将其作为过滤器添加到 Global.asax 中的 GlobalFilterCollection

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new LogOnAuthorizeAttribute());
}

关于c# - 在不重定向 MVC3 中的用户的情况下覆盖 RenderBody 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410425/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com