0

这个问题一直困扰着我,任何解释为什么会有所帮助。

给定以下 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总是返回默认值“Monkey”。现在我确实实现了一个解决方法,我将值存储在一个隐藏字段中,然后在按钮单击时调用该值并且它有效。我确实尝试了更新面板,但没有运气,但这并不重要,因为我讨厌更新面板并且从不使用它们。

4

3 回答 3

2

这是一个限制——如果你想这样称呼它的话——HTML 和回发的方式。据我所知,它甚至不是 ASP.NET 的限制:它超出了这个范围。

只有某些标签的值才会回传到服务器。我认为这只是 INPUT 和 SELECT 标签,尽管可能有一个我没有想到。

标签中的属性甚至不会被回发:只是值。

因此,服务器对您在客户端上所做的更改一无所知,除非它是在 SELECT 中选择的内容或 INPUT 的值。ASP.NET 中的所有内容,从 ViewState 和回发数据重建的所有内容,都基于这些标记。

所以你的隐藏领域是你想要的事情发生的唯一途径。

于 2013-02-26T18:30:03.627 回答
0

在 SELECT 的情况下,如果在 JQuery 中将“禁用”属性设置为 true,然后在 ASP .Net 代码隐藏中,您将不会获得正确的值,而是会获得列表中的第一项作为 selecteditem 并且它是对应的值作为选定值。INPUT 也是如此。

我认为最简单的选择是使用隐藏字段,在 JQuery 中填充它们并在代码隐藏中使用它们的值。

于 2013-04-09T17:04:53.257 回答
0

另一个常见原因是,如果您在 page_load 函数后面的代码中重建下拉列表,而没有检查它是否不是IsPostBack第一个。这将导致您每次将值重置为默认/第一项。

于 2013-12-04T07:59:18.957 回答