2013-02-26 87 views
0

這個問題一直在竊聽我,任何解釋爲什麼這會有所幫助。Asp.NET沒有獲取由javascript設置的自定義屬性的更新值

鑑於以下DOM:

<body> 
<form id="form1" runat="server"> 

    <div id="myDiv" runat="server" data-type="Monkey"> 
     Choose your inner animal! 
     <ul> 
      <li class="selected">Monkey</li> 
      <li>Tiger</li> 
      <li>Dog</li> 
      <li>Bunny</li> 
     </ul> 
    </div> 

    <asp:Button runat="server" ID="btnSubmit" Text="Submit" /> 

</form> 
</body> 
<script src="Assets/js/jquery-1.9.0.min.js" type="text/javascript"></script> 
<script> 
$(document).ready(function() { 

    $('li').bind('click', function() { 
     $('li.selected').removeClass('selected'); 
     var animal = $(this).addClass('selected').text(); 

     //$('#myDiv').data('type', animal); 
     $('#myDiv').attr('data-type', animal); 
    }); 

}); 
</script> 

代碼背後:

Partial Class _Default 
Inherits System.Web.UI.Page 

Protected Sub btnSubmit_Click(sender As Object, e As System.EventArgs) Handles btnSubmit.Click 
    Dim type As String = myDiv.Attributes("data-type") 

    MsgBox(type) 
End Sub 
End Class 

的MSGBOX 總是回來了 '猴子' 的默認值。現在我確實實施了一種解決方法,將該值存儲在隱藏字段中,然後在按鈕單擊時調用該值並且可以工作。我確實嘗試過更新面板,但沒有運氣,但這並不重要,因爲我討厭更新面板,並且從不使用它們。

+0

更新面板是驚人的... – 2013-02-26 18:22:12

回答

2

這是一個限制 - 如果你想調用它 - HTML的方式和事情發回。就我所知,它甚至不是ASP.NET的限制:它超出了這個範圍。

只有某些標籤將其值返回給服務器。我想這只是INPUT和SELECT標籤,儘管可能有一個我沒有想到。

標籤中的屬性甚至不會回傳:只是值。

所以服務器不知道你在客戶端上做了什麼改變,除非它是在SELECT中選擇的或INPUT的值。 ASP.NET中的所有東西,從ViewState重建的所有東西和回發數據都基於這些標籤。

所以你的隱藏領域是你想要發生的唯一途徑。

+1

+1 Ann是正確的。屬性不會被回發。只有具有NAME屬性的輸入元素(任何輸入元素,廣播,複選框,選擇,文本等)被回傳。此外,即使具有NAME屬性,「禁用」的輸入元素也不會被回傳。 – Icarus 2013-02-26 18:39:17

+0

Textarea將是另一個 – Sam 2013-02-26 18:42:02

+0

雅有道理,猜我沒有真正認爲它通過 – zgood 2013-02-26 18:46:27

0

在SELECT的情況下,如果在JQuery中將「disabled」屬性設置爲true,那麼在ASP .Net代碼隱藏中,您將無法獲得正確的值,而是會將列表中的第一項selecteditem和它的相應值作爲selectedvalue。 INPUT也是如此。

我認爲最簡單的選擇是使用隱藏字段,在JQuery中填充它們並在代碼隱藏中使用它們的值。

0

另一個常見原因是,如果您在page_load函數後面的代碼中重新生成下拉列表,而沒有首先檢查它不是IsPostBack。這會導致您每次將該值重置爲默認/第一項。

相關問題