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

时间:2016-02-18 14:33:10

标签: c# asp.net master-pages

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

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

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

我所做的只是......

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

3 个答案:

答案 0 :(得分:1)

您从网页上获得了对主页的引用。 您可以调用findcontrol来获取选择。

Master.FindControl("IDofYourSelect");

要实现这一点,您应该使用asp:dropdownlist而不是select!

现在,您可以在需要db-connection

之前处理页面代码中的连接选择

答案 1 :(得分:1)

这可以通过构建您自己的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"];
        }
    }
}

这样,即使您将来要更改为其他母版页(或对不同页面使用不同的母版页),也要确保会话得到正确处理。

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

答案 2 :(得分:1)

在ASP.NET WebForms中,始终从最内层处理页面事件。这意味着事件将始终首先在“内容”页面上触发,然后继续进入母版页。

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

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