[英]ASP.NET C# Check for FORM value in Master Page
我有一個用C#編寫的ASP.NET網頁。 在我的母版頁中,我有一個<select>
元素,該元素允許用戶在兩個不同的數據庫之間切換。 我以為我可以將代碼添加到母版頁Page_Load()方法中,以檢查包含選擇內容的表單是否已提交,如果是,則設置一些會話變量來定義我要連接的數據庫。
問題是,它看起來像頁面本身在母版頁的Page_Load方法之前加載,因為當我提交表單時,它確實更新了會話變量,但是我的查詢仍在查看原始數據庫。 但是,如果我兩次提交表格,它將進行注冊。
我猜測母版頁的Page_Load方法必須在頁面的Page_Load方法之后觸發。 有什么地方可以放置我的代碼,以便在所有頁面上觸發該代碼,但在頁面加載之前執行?
我要做的就是...
if (Request.Form["database"] != null) {
Session["database"] = Request.Form["database"];
}
您從頁面上獲得了對母版頁的引用。 您可以調用findcontrol獲取選擇。
Master.FindControl("IDofYourSelect");
要使此工作正常,您應該使用asp:dropdownlist而不是select!
現在您可以在需要db-connection之前處理頁面代碼內的連接選擇
這可以通過構建自己的IHttpModule
實現並將其注冊到web.config文件中來實現。
https://msdn.microsoft.com/zh-CN/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中,始終從最內層向外處理Page事件。 這意味着該事件將始終始終首先在“內容”頁面上觸發,然后繼續進入母版頁。
您可以采用的一種策略是在頁面生命周期的較早階段掛入一個事件,該事件將在其進入內容頁面之前在母版頁面上觸發。
見在回答這個職位頁面生命周期的參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.