2010-04-13 120 views
0

我遇到了兩個單選按鈕的簡單收音機問題(我不想使用RadioButtonList [RBL],因爲RBL不允許子控件,在我的情況下,如果你選擇了一個選項,我想啓用按鈕旁邊的文本框;是的,你可以用jQuery來移動文本框,但這太髒了!)。我會檢查一個,提交表單(明確或通過AutoPostBack),並且CheckedChanged事件永遠不會觸發。當頁面重新加載時,無論它們在非回發加載時的初始狀態還是表單提交前的狀態,這兩個按鈕都將被取消選中。ASP.Net RadioButton丟失ViewState

我拿出了這個複選框,並把它解釋成我能想到的最簡單的例子。我將EnableViewState = true拋到了這個地方,以防萬一它無法找到的地方被禁用。

<form id="form1" runat="server" enableviewstate="true"> 
    <div> 
     <asp:RadioButton ID="foo" Text="foo" runat="server" AutoPostBack="true" OnCheckedChanged="rbChanged" Checked="true" GroupName="foobar" EnableViewState="true" /> 
     <asp:RadioButton ID="bar" Text="bar" runat="server" AutoPostBack="true" GroupName="foobar" 
      OnCheckedChanged="rbChanged" Checked="false" EnableViewState="true" /> 
     <asp:Label runat="server" ID="resultLbl" /> 
    </div> 
</form> 

protected void rbChanged(object sender, EventArgs e) 
{ 
    if (foo.Checked) resultLbl.Text = "foo is checked"; 
    else if (bar.Checked) resultLbl.Text = "bar is checked"; 
    else resultLbl.Text = "neither is checked"; 
} 
+0

你發佈的代碼應該可以工作,但我不確定如果我很好地理解它不適合你。你可以試着更好地解釋它嗎? – 2010-04-13 19:50:50

+0

FWIW下的文件,當我添加一對與頁面具有相似行爲的複選框時;他們正常工作。如果我使用VS立即窗口在PageLoad期間檢查foo或bar,那麼當foo不是回發時檢查foo,否則兩者都不會被檢查。 – 2010-04-13 19:59:52

+0

代碼不起作用 - 結果標籤永遠不會有任何文本,並且CheckedChanged事件(rbChanged)永遠不會觸發。 – 2010-04-13 20:00:28

回答

2

事實證明,這是因爲我們有一個自定義適配器爲單選按鈕(或者對於所有System.Web.UI.WebControls.CheckBox es)呈現HTML。我們的動機是因爲.NET會在LABEL和輸入中加入disabled =「disabled」屬性,這是不好的HTML,更糟糕的是,實際上它被解釋爲IE的意思! (請自己檢查一下 - 寫一個禁用了標籤的HTML頁面,並在FF和IE中進行測試。)

我們使用了Reflector來查看我們正在混合的步驟以及真正的適配器的功能,並發現Name屬性設置不正確。雖然它將給定組中的所有RB設置爲相同的名稱,但在我們的有限新解決方案測試用例中它與我們的自定義適配器測試用例中的名稱屬性不同。當我們看看如何安全地生成這些內容時,我們發現我們的回發突然發生了!

如果我們獲得老闆的許可,我們會將我們的適配器提供給CSSFriendly,以防其他人使用這種東西。

+0

有趣的問題和解決方案。對於它的價值 - 我過去使用過CSSFriendly適配器,並遇到比我想象的更小的問題。有時候「完美」的html真的被高估了。最終,最終用戶可用的網站是關鍵。他們可以不關心有效的html。這是一個漂亮的標記和開發時間恕我直言之間的平衡行爲。通常使用生成的標記框架(如ASP.NET)確保完全有效且「最佳實踐」的HTML比其值得的麻煩更多。只是我2美分。 – 2010-04-14 14:02:53

+0

唯一的問題是,IE瀏覽器正在「暗淡」已禁用的標籤。正如將其淡化爲灰色,就像禁用的窗體控件一樣。這基本上不可能讀到一些背景顏色,我們不想說「我們不能使用背景顏色,因爲我們無法控制HTML」,因爲這很糟糕。 :) 仍然沒有得到所有的扭結 - 它不會產生正確的組,如果你有一個命名容器要考慮。 MS有太多的內部方法! – 2010-04-14 14:35:11

+0

我認爲問題是任何禁用的控件都將失去視圖狀態 – 2015-07-21 13:52:16

0

我測試了你的確切代碼,它工作正常。當您選擇任一單選按鈕時,標記會在回發過程中更新,當頁面刷新時會顯示正確的信息。

+0

嗯。如果問題仍然存在,我會查看是否將該頁面複製到新的解決方案中。 – 2010-04-13 20:03:58

+0

它實際上在新的解決方案中工作...診斷繼續... – 2010-04-13 20:13:53

0

在某些情況下,問題可能由代碼隱藏中的ScriptManager引起。

例如,

ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "DisplayMessage", "javascript: HideProcessingImage();", true); 

在不同的使用方法與上面相同的密鑰名稱可能是單選按鈕自動回不靈的問題。 我遇到過這個問題,所以任何有同樣問題的人都可以解決他們的問題。