我有一个用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"];
}
答案 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帖子中的答案,以获取页面生命周期的参考。