ASP.NET C# 检查母版页中的 FORM 值

ASP.NET C# Check for FORM value in Master Page

我有一个用 C# 编写的 ASP.NET 网页。在我的母版页中,我有一个 <select> 元素,它允许用户在两​​个不同的数据库之间切换。我以为我可以向母版页 Page_Load() 方法添加代码来检查是否已提交包含 select 的表单,如果已提交,则设置一些会话变量来定义我正在使用的数据库连接到。

问题是,页面本身似乎在母版页的 Page_Load 方法之前加载,因为当我提交表单时它确实更新了我的会话变量,但我的查询仍在查看原始数据库。但是,如果我提交两次表单,它就会注册。

我猜测母版页的 Page_Load 方法必须在页面的 Page_Load 方法之后触发。有没有什么地方可以放置我的代码,以便它会在所有页面上触发但会在页面加载之前执行?

我所做的只是...

if (Request.Form["database"] != null) {
     Session["database"] = Request.Form["database"];
}

您从您的页面获得了对母版页的引用。 您可以调用 findcontrol 来获取 select.

Master.FindControl("IDofYourSelect");

要实现此功能,您应该使用 asp:dropdownlist 而不是 select!

现在您可以在需要数据库连接

之前在页面代码中处理连接selection

这可以通过构建您自己的 IHttpModule 实现并将其注册到您的 web.config 文件中来实现。

https://msdn.microsoft.com/en-us/library/ff649096.aspx

public class DatabaseSwitchModule : IHttpModule
{
    private HttpApplication httpApp;
    public void Init(HttpApplication httpApp)
    {
        this.httpApp = httpApp;
        httpApp.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);
    }

    public void OnPreRequestHandlerExecute(object sender, EventArgs e)
    {
        NameValueCollection form = httpApp.Request.Form;
        if (form["database"] != null)
        {
            httpApp.Session["database"] = form["database"];
        }
    }
}

这样您就可以确保会话得到正确处理,即使您将来要更改为另一个母版页(或为不同的页面使用不同的母版页)也是如此。

您真的不应该信任母版页来执行重要的业务逻辑。页面和母版页用于显示。

在ASP.NET WebForms中,页面事件总是从最内层开始处理。这意味着该事件将始终先在内容页上触发,然后再进入母版页。

您可以采用的一种策略是在页面生命周期的早期挂钩一个事件,该事件将在母版页上触发,然后再在内容页上触发。

请参阅 this post 中的答案以获取页面生命周期的参考。