Asp.net从javascript添加项目到dropdownlist并提交表单

时间:2015-04-10 09:55:46

标签: jquery asp.net ajax

下午好,

我有以下问题。我有一个位置下拉列表,默认从数据库加载。链接添加用于打开弹出窗口以添加新位置。

enter image description here

我可以设法通过jquery将新项目添加到下拉列表中,但是当我提交按钮保存以保存记录时,我收到以下错误:

  

' /'中的服务器错误应用

     

无效的回发或回调参数。事件验证已启用   在配置中使用或<%@   Page EnableEventValidation =" true" %GT;在一个页面中。为了安全   目的,此功能验证回发或回调的参数   事件源自最初呈现的服务器控件   他们。如果数据有效且预期,请使用   ClientScriptManager.RegisterForEventValidation方法   注册回发或回调数据以进行验证。描述:   在执行当前期间发生了未处理的异常   网络请求。请查看堆栈跟踪以获取更多信息   错误以及它在代码中的起源。

     

异常详细信息:System.ArgumentException:无效的回发或   回调参数。使用配置或<%@ Page启用事件验证   EnableEventValidation ="真" %GT;在一个页面中。出于安全考虑,   此功能验证回发或回调事件的参数   源自最初呈现它们的服务器控件。如果   数据有效且预期,使用   ClientScriptManager.RegisterForEventValidation方法   注册回发或回调数据以进行验证。

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[ArgumentException:无效的回发或回调参数。事件   使用in启用验证   配置或<%@ Page EnableEventValidation =" true" %GT;在一个页面中。   出于安全考虑,此功能会验证参数   回发或回调事件源自服务器控件   最初渲染它们。如果数据有效且预期,请使用   ClientScriptManager.RegisterForEventValidation方法   注册回发或回调数据以进行验证。]
  System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId,   字符串参数)+8646569
  System.Web.UI.Control.ValidateEvent(String uniqueID,String   eventArgument)+69
  System.Web.UI.WebControls.DropDownList.LoadPostData(字符串   postDataKey,NameValueCollection postCollection)+53
  System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.LoadPostData(字符串   postDataKey,NameValueCollection postCollection)+13
  System.Web.UI.Page.ProcessPostData(NameValueCollection postData,   Boolean fBeforeLoad)+343
  System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   1743

     

版本信息:Microsoft .NET Framework版本:2.0.50727.5448;   ASP.NET版本:2.0.50727.5459

我不知道究竟是什么问题,以及如何解决它。

这是我的原始HTML代码:

<div class="addNew" title="Add New Position Title">
    <table>
        <tr>
            <td>Position Title</td>
            <td><asp:TextBox ID="txtPositionTitle" runat="server" /></td>
        </tr>            
    </table>
</div>   




<table class="ui-accordion">
    <tr>
        <td>Position</td>
        <td>
                    <asp:DropDownList ID="DropDownList1" runat="server" AppendDataBoundItems="True" AutoPostBack="True" DataSourceID="ObjectDataSource1" DataTextField="PoTitle" DataValueField="ID" >
                        <asp:ListItem Value="-1">...</asp:ListItem>
                    </asp:DropDownList>
                    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetAll" TypeName="WH.Service.PositionService"></asp:ObjectDataSource>         

            <asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="#">Add</asp:HyperLink> </td>
    </tr>
    <tr>
        <td>Qualification</td>
        <td>

                <asp:CheckBoxList ID="chklstQualification" runat="server" DataSourceID="oDsQualification" DataTextField="QName" DataValueField="ID" RepeatColumns="4" Width="800px" CssClass="TOG_CHECK">
                </asp:CheckBoxList>
                <asp:ObjectDataSource ID="oDsQualification" runat="server" SelectMethod="GetAll" TypeName="WH.Service.QualificationService"></asp:ObjectDataSource>

        </td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td colspan="2">
            <asp:Button ID="Button1" runat="server" Text="Save" OnClick="Button1_Click" />
        </td>
    </tr>
</table>

<script type="text/javascript">
    $(function () {
        $(".addNew").dialog({
            autoOpen: false,
            width: 300,
            height: 300,
            modal: true,
            close: function (event, ui) {
                //location.reload(false);
            },
            buttons:
            {
                "Add": function () {
                    var poTitle = $("#<%= this.txtPositionTitle.ClientID  %>").val();


                    $.ajax({
                        type: 'POST',
                        url: '/Helper/WhHelper.asmx/AddNewPosition',
                        data: '{"PoTitle":"' + poTitle + '"}',
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function (msg) {
                            if (msg.d) {
                                //Alert successfull saving record
                                alert("Successfully added new item");                                  

                                //Adding item to selection list
                                var p = msg.d;                                   
                                $('#<%= this.DropDownList1.ClientID %>').append('<option value="' + p.ID + '" selected="true">' + p.PoTitle + '</option>');

                                //Close Dialog Box
                                $(".addNew").dialog("close");
                            }

                        },
                        error: function () {
                            alert("Error! Try again...");
                        }
                    });

                },
                "Cancel": function () {
                    $(this).dialog("close");
                }
            }
        });

        $("#<%= this.HyperLink2.ClientID %>").click(function (event) {
            event.preventDefault();
            $(".addNew").dialog("open");
        });
    });
</script>

1 个答案:

答案 0 :(得分:0)

这里的问题是您的系统检测到发送到服务器的数据已在客户端上被更改。

您的系统正在检查发送到服务器的控制数据是否来自同一服务器,并且当您向下拉列表添加新选项时,它会将其标记为潜在的恶意数据。这就是错误的原因。

我认为您可以避免添加

这种默认行为
<%@ Page EnableEventValidation="false" %>

到您的页面,因此客户端事件验证未完成,并且您的下拉列表的更改未注册为危险。