2009-11-14 97 views
2

我在每個頁面上都有一個搜索表單,因此我把它放在master頁面上。在添加了runat=server之後,我現在無法使用其他形式的runat服務器;)asp.net表單runat服務器

人們通常會如何避免這種情況?

一個想法是用一個表格runat=server包圍整個頁面,但是我必須在主頁面中包含代碼,即使對於僅在一個子頁面上使用的表單(例如contact),也是如此。

怎樣的人通常在這得到什麼?

日Thnx

回答

7

這通常被認爲是對ASP.NET最有問題的設計決策之一。這是一個可悲的事情,你有點固定這種每頁一頁的原則。

你可能想要有多種形式的一個原因是默認按鈕將被瀏覽器設置爲提交按鈕。有人在您的搜索框中輸入內容並按回車鍵不應提交主窗體(假設這是登錄頁面),而是提交搜索按鈕的小形式。

最簡單的和「標準」的方式來解決,這是使用ASP:面板和設置DefaultButton屬性。這應該包括包含搜索字段和搜索按鈕的部分。

不要擔心從主頁面內部編碼<form>,圍繞整個頁面。這是一個常見的設計。大多數服務器控件都需要一個表單,所以爲什麼不簡單地包含它呢:它應該在那裏。

+0

我明白了。我只是認爲編寫母版頁上一頁的表單是錯誤的。某種程度上不適合我:P,但正如你所說這是常見的設計,也許我應該。日Thnx。 – b0x0rz

+1

在ASP.NET的開始,人們經常不理解MS爲什麼選擇這種每頁只有一個和一個表單的設計。它具有優點(簡單性有利於複雜性)和缺點(某些傳統方法需要重新考慮)。還有一些解決方法,但總括來說,我的建議是:堅持這個設計並使用它的功能,並且只有當你確實需要並且完全理解它的後果時纔開始構建「非默認」設計模式。 – Abel

1

第一個問題是,爲什麼你想有多個RUNAT = 「服務器」 的形式?

您仍然可以在頁面上使用沒有runat="server"的窗體,或者使用Button控件上的PostBackUrl屬性來發布到不同的ASP.NET頁面。

要在一個多步驟的過程中收集的數據,你可以看一下ASP.NET嚮導控制,參見Scott Guthrie的blog post here

或者你可以管理它自己所有並使用ASP.NET面板,或者使用已經提到PostBackUrl從ASP.NET頁面導航到不同的頁面。

+0

以及(真的不知道到底是什麼你指的是 - 爲什麼你要的是什麼?) - 我必須做一些複雜的解析搜索,然後轉到下一頁。也爲聯繫人(例如)我想做一些像db插入可能的東西,然後轉到下一頁。 – b0x0rz

+0

啊,好(編輯後)。以及我不想:)只是不知道如何分開兩種形式的代碼。一個應該在母版頁上,因爲它總是被使用,另一個在單頁上(因爲它只在那裏被使用)。Abel(在這個頁面上)提到,即使第二種形式只在一個子頁面上使用,也可以在母版頁上擁有所有的代碼。 – b0x0rz

+1

使用*「所有代碼」*我的意思是'

'標籤。習慣上把它們放在Master裏,只是因爲你必須擁有它們(提供了一些例外)。就我個人而言,我經常使用兩級主人:一個乾淨的沒有形式的根主人,以及幾個從主人繼承的子主人(主人可以嵌套)。這樣我就可以根據需要決定每頁的內容,而不會失去任何靈活性。這取決於你的情況,最終最合適的。 – Abel

2

我建議你有搜索HTML表格W母版頁上/ O = RUNAT服務器,像

<form action="Search.aspx" method="get"> 
    <input type="text" name="q" /><input type="submit" /> 
</form> 

使用方法=獲取有可能採取的搜索URL。然後做任何你在Search.aspx的代碼隱藏需要與查詢:

public void Page_Load(object sender) 
{ 
    string q = Context.Request.QueryString["q"]; 
    /*...*/ 
} 
相關問題