【问题标题】:Reference 'this' in master page在母版页中引用“this”
【发布时间】:2016-02-27 01:38:54
【问题描述】:

我正在开发一个新的 asp.NET 项目(具体来说是 .NET 版本 4.5)。我正在尝试使用最佳实践来创建这个项目,但不幸的是,我不知道在这种情况下要查找的术语 - 希望这个问题能说明问题。

从默认模板创建新项目后,我获得了登录系统所需的页面。我现在想做到这一点,以便整个站点都需要登录,然后您才能看到任何内容。为此,我只需检查您的用户是否在页面加载时登录,如果没有,则将您重定向到登录页面。

这是我目前所拥有的 - 它工作正常,但不是“全球性的”。

在单个页面上:

protected void Page_Load(object sender, EventArgs e)
{
    //If the user isn't logged in, make them log in
    redirectIfNotLoggedIn(this);
}

public static void redirectIfNotLoggedIn(_Default _Default)
{
    if (!_Default.User.Identity.IsAuthenticated) { _Default.Response.Redirect("~/Account/Login.aspx"); }
}

它有效 - 如果我没有登录,它会将我带到 Login.aspx 页面。如果我登录了,我就可以浏览该网站。此代码的问题是我必须将其复制并粘贴到每个页面中。因此,我想将此代码放在 Site.Master 文件的 Page_Load 中,这将强制用户进行身份验证,无论他们试图访问哪个页面。但是,我不能在 Site.Master 中使用“this”上下文,这是有道理的 - 但我不知道替代方案是什么。

我这样做是否正确?有没有更好的办法?如何使项目中每个页面的身份验证要求“全局”?

【问题讨论】:

  • 您可能想看看msdn.microsoft.com/en-us/library/…,尤其是授权过滤器。
  • 为什么不能在主文件中使用this
  • @Chris 我现在正在阅读这些页面,我到底应该寻找什么?我会把这样的过滤器放在哪里?
  • @Chris 你已经为 MVC 链接了一篇文章,而这正在使用网络表单,所以没用。
  • @DavidG 虽然我想我可以使用它,但它是 SiteMaster 类型而不是 _Default 类型 - 并且 SiteMaster 没有 .User 的定义

标签: c# asp.net this master-pages


【解决方案1】:

在 MasterPage 中,您可以使用this.Page 来获取您要查找的页面对象。

但也可以考虑另一种方法: 我通常创建一个类MyBasePage,继承自System.Web.UI.Page,并将我的Web 应用程序中所有页面共享的所有(或大部分)公共逻辑放在其中。

然后我创建每个页面,将基类从System.Web.UI.Page 修改为MyBasePage

【讨论】:

  • 我相信这行得通——尽管我似乎确实在我的计划中发现了一个小缺陷,因为它现在无论如何都会将你重定向到 /Account/Login——即使那是你的页面试图去 - 导致持续重定向......我会解决这个问题!关于您的其余评论,与我的方式相反,这样做的原因是什么?
  • 使用 MyPageBase 允许您为所有页面创建通用行为。最终,如果您想更改默认行为,您可以使用一些虚拟方法/属性编写该类,并仅在一个特定页面中覆盖它们。您也可以使用 MasterPage 进行类似的操作,但我发现在页面级别使用它更容易,而不是在 MasterPage 中使用它。可能是口味问题,但我发现使用继承方法而不是 MasterPage 方法更灵活。
  • 假设您希望在所有页面中都有一个成员变量CurrentUser:将其存储在MyPageBase 或MasterPage 中是否更容易,必须在每个页面中将其引用为(MyMasterPage) this.MasterPage.CurrentUser
  • 非常真实!谢谢!
猜你喜欢
  • 2012-05-11
  • 2018-06-28
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多