ASP.NET中的基页

Tea*_*eek 11 asp.net

您是否建议在Visual Studio中创建的每个网站上创建一个充当父类的基页?

有什么确切的好处/缺点?

Phi*_*ove 10

如果要覆盖ASP.NET中某些工作的方式,将它构建到基类而不是在每个页面中包含代码可能更有效.我完成这个的两个具体实例是:

IsPostback
鲜为人知的事实:制作一个请求是非常可行的,对于ASP.NET来说,它看起来像一个回发但是通过GET请求提交.谁这样做?黑客,那是谁.IsPostback在这种情况下true,呼叫将返回,但它确实会返回false.为了解决这个问题,构建一个覆盖IsPostBack的基类:

Public Class MyBase
    Inherits System.Web.UI.Page
    <DebuggerStepThrough()> _
    Public Shadows Function IsPostback() As Boolean

        'Check the built-in IsPostback and make sure this is a HTTP POST
        Return (Page.IsPostBack AndAlso Request.HttpMethod.ToUpper = "POST")

    End Function

End Class
Run Code Online (Sandbox Code Playgroud)

错误处理
ASP.NET安全性开始时,Blowdart讨论了如果您使用ASP.NET的错误处理将客户端重定向到自定义错误页面这一事实,黑客(再次)可以检测重定向并将其标记为可能出现的错误利用.更安全的模式是处理Page的Error事件并执行Server.Transfer(它不向客户端发送任何内容).同样,在基类中执行此操作意味着您只需编写一次代码:

public partial MyBase : System.Web.UI.Page
{
    protected void Page_Error (object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        // Do something with the exception e.g. log it
        ...

        Server.Transfer("~/mycustomerrorpage.aspx");
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一篇较旧的帖子,但对于将来可能会参考此答案的人,我最好添加此内容。我不会将错误处理放在页面基类的 Page_Error 事件处理程序上。我会把它放在 global.asax Application_Error 事件处理程序中。这样,无论页面是否使用您的基类,都会安全地捕获和处理任何错误。 (2认同)

usr*_*ΛΩΝ 5

是的,我愿意.

但请记住,基页的目的与母版页的目的完全不同.

让我解释.

母版页

是布局元素,用于在与主关联的所有页面之间共享相同的图形功能和部分webforms行为(认为具有代码隐藏的登录/注销框).您的最终页面类将包含对母版页的引用,因此最终结果将显示为包含您的页面的母版页(检查源代码以告知谁包含您的页面)

基页

是(抽象的?至少没有密封!)类,您的所有页面都从代码隐藏视图继承.除非您明确地以编程方式将控件添加到basae页面,即.在构造函数via LoadControl方法中,所有页面从一开始就看起来是空白的,直到您添加代码.

但它们通常很有用.如果要覆盖某些基类方法,可以在所有页面上共享覆盖行为.或者,您可能希望将特定于应用程序的对象公开给子页面(对数据访问层,记录器或其他任何内容的引用).一个示例是覆盖UICulture属性以从cookie中检索用户首选语言.

两者都可以合并

根据您的目标,您可以将母版页与基页组合在一起.

我建议你总是创建一个基页类,因为如果你的应用程序的需求随着时间而变化并且你已经创建了很多页面,你可以尝试修改基类,根据复杂程度将修改传播到所有页面他们

  • 马特回答了关于母版页的问题.我的答案完成了另一个 (3认同)