Page.EnableEventValidation = false 不识别新的下拉列表值

Page.EnableEventValidation = false does not recognize new dropdownlist values

我的测试网络表单有 1 个 dropdownlist 和 2 个 buttons。就是这样:

<form id="form1" runat="server">
    <asp:DropDownList ID="DropDownListTest" runat="server" >
        <asp:ListItem>Value 0</asp:ListItem>
        <asp:ListItem>Value 1</asp:ListItem>
        <asp:ListItem>Value 2</asp:ListItem>
    </asp:DropDownList>

<asp:Button ID="ButtonClient" runat="server" Text="Button" OnClientClick="ChangeDropDown(); return false;" />

<asp:Button ID="ButtonServer" runat="server" Text="Server" onclick="ButtonServer_Click" />
</form>

这是javascript函数ChangeDropDown():

function ChangeDropDown() {
        for (i = document.getElementById("<%=DropDownListTest.ClientID%>").options.length - 1; i >= 0; i--) {
            document.getElementById("<%=DropDownListTest.ClientID%>").remove(i);
        }
        var opt = document.createElement("option");

        opt.text = "Complete";
        opt.value = "Complete";
        document.getElementById("<%=DropDownListTest.ClientID%>").options.add(opt);


        var opt2 = document.createElement("option");
        opt2.text = "Not Complete";
        opt2.value = "Not Complete";
        document.getElementById("<%=DropDownListTest.ClientID%>").options.add(opt2);
} 

这是代码隐藏:

    protected void ButtonServer_Click(object sender, EventArgs e)
    {
        string val = this.DropDownListTest.SelectedValue;
    }
    protected void Page_PreInit(object sender, EventArgs e)
    {
        Page.EnableEventValidation = false;
        //"Invalid postback or callback argument" if I remove this.
    }

假设我单击 button ButtonClient(这会更改下拉列表的值)、select "Complete",然后单击 ButtonServer。在代码隐藏中,this.DropDownListTest.SelectedValue 的值等于 "Value 0" 而不是 "Complete".

我明白我为什么会遇到这个问题,但是除了添加项目代码隐藏之外还有其他解决方案吗?

您无法以标准方式获取值,因为服务器不知道下拉列表的项目已更改。

但是,您可以直接从请求中获取值:

protected void ButtonServer_Click(object sender, EventArgs e)
{
    string val = Request[this.DropDownListTest.UniqueID];
}