使用javascript在ASP.NET中的ListBox之间移动项目的最佳方法,然后在服务器端访问结果

时间:2011-02-04 22:42:24

标签: javascript asp.net listbox

我在看似简单的事情上遇到了很多麻烦。 在ASP.NET webform中,我有两个ListBox,其间有Add和Remove按钮。 用户可以在一个ListBox中选择项目并使用按钮交换它们。

我在客户端使用javascript执行此操作。

然后我还有一个SAVE按钮,当用户对他们的列表感到满意时,我想在服务器端处理它。

问题:首先,当我点击SAVE时,我遇到了以下问题:

*

无效的回发或回调参数。使用配置或<%@ Page EnableEventValidation =“true”%>启用事件验证在一个页面中。出于安全考虑,此功能可验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。

*

我读到了解决这个问题的方法之一是将我的ListBoxes放入UpdatePanel,我做了,我正在进一步。

但是,现在,如果用户已使用clientside javascript来更改列表框的内容,则不会运行按钮的Click事件的事件处理程序。如果用户没有更改列表框的内容,则处理程序会执行。

发生了什么事?

我的方法是否基本上存在缺陷,并且可能有更好的方法解决这个问题?

感谢您的帮助!

这是ASPX代码:

    <table>
        <tr>
            <td>
                <asp:ListBox ID="fromListBox" runat="server" SelectionMode="Multiple" Rows="8" AutoPostBack="false" 
                    DataSourceID="SqlDataSource1" DataTextField="FullName" DataValueField="UserId" CssClass="teamListBox">
                </asp:ListBox>

            </td>

            <td> 
                <input id="btnAdd" type="button" value="Add >" /><br/>
                <br/>
                <input id="btnRemove" type="button" value="< Remove" /><br/>
                <br/>
            </td>

            <td>
                <asp:ListBox ID="toListBox" runat="server" SelectionMode="Multiple" Rows="8" AutoPostBack="false"
                    CssClass="teamListBox" DataSourceID="SqlDataSource2" DataTextField="FullName" 
                    DataValueField="UserId" >
                </asp:ListBox>  
            </td>
        </tr>
    </table>

继承javascript,使用jquery ....这样可以正常工作,所以不是真正的问题:

    $(document).ready(function () {

        $("#btnAdd").click(function () {
            $("#fromListBox option:selected").appendTo("#toListBox");
        });

        $("#btnRemove").click(function () {
            $("#toListBox option:selected").appendTo("#fromListBox");
        });

    });

3 个答案:

答案 0 :(得分:1)

只需转到您应用中的网络配置文件,然后在网页部分添加 enableEventValidation =“false”

答案 1 :(得分:0)

我想我刚才有同样的问题。我通过将列表框的值分配给隐藏文本字段并使用javascript提交页面来解决它。 在服务器端,我读取了该隐藏文本字段的值并对其进行了解析。 这是一个丑陋的客户端/服务器代码,但它对我有用。

答案 2 :(得分:0)

干净的方法是使用ClientScriptManager.RegisterForEventValidation方法。

还要看here

您必须在服务器控件ID中注册该控件可以在页面的Render Event中通过JavaScript发布的所有可能值,例如:

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
   ClientScript.RegisterForEventValidation("fromListBox", "English");
   ClientScript.RegisterForEventValidation("fromListBox", "Tamil");
   ClientScript.RegisterForEventValidation("fromListBox", "Hindi");
   ClientScript.RegisterForEventValidation("toListBox", "English");
   ClientScript.RegisterForEventValidation("toListBox", "Tamil");
   ClientScript.RegisterForEventValidation("toListBox", "Hindi");
   base.Render(writer);
}