【问题标题】:Calling code behind with event handler not working使用事件处理程序调用代码不起作用
【发布时间】:2016-08-01 11:37:32
【问题描述】:

我有一个由两个下拉框和一个网格视图组成的网页。我创建了一个 Web 服务来收集下拉框的数据,并使用 ajax 调用来填充它们。我遇到的问题是当我尝试添加 OnSelectedIndexChanged 事件处理程序时,它似乎无法正常工作。我环顾四周,尝试了一些事情。我已将 EnableEventValidation 设置为 false(我认为这解决了与我的 ddl 在 js 中动态填充相关的问题)。我还在我的 ddl 上启用了 AutoPostBack。

当我更改 ddl 索引时,页面似乎正在回发,但我的 dll 索引反转回之前选择的索引。

<div class="row control-group">
     <div class="form-group col-xs-12" id="mailbox">
           <label>Which bills would you like to view?</label>
           <asp:DropDownList ID="ddlDepartment" runat="server" CssClass="form-control"></asp:DropDownList>
           <asp:DropDownList ID="ddlUser" runat="server" CssClass="form-control" OnSelectedIndexChanged="ddlUser_SelectedIndexChanged" AutoPostBack="true"></asp:DropDownList>
           <p class="help-block text-danger"></p>
    </div>
</div>

var a = 1;只是为了让我可以在那里放一个断点。

protected void ddlUser_SelectedIndexChanged(object sender, EventArgs e)
{
   var a = 1;
}

下面是ajax请求和grid的生成

function getUsers() {

  var department = $('select#MainContent_ddlDepartment option:selected').val();

  $.ajax({
      type: "GET",
      url: "WEBSERVICEURL" + department + "",
      contentType: "json",
      dataType: "json",
      async: false,
      success: function (data) {
          var ddlUsers = $("#MainContent_ddlUser");
          ddlUsers.empty();
          $.each(data, function () {
              ddlUsers.append($("<option></option>").val(this['SamAccountName']).html(this['DisplayName']));
          });
      },
      error: function (xhr) {
      }
  })
}

谢谢

【问题讨论】:

  • 您的 asp.net 控件是否位于带有 runat=server 的 asp:form 中?
  • @ZaidAlShatle 是的

标签: javascript c# jquery asp.net ajax


【解决方案1】:

您不能这样做。ASP.NET 中内置了一个称为事件验证的安全功能,可防止您发布服务器创建页面时不存在的数据。

您(或黑客)正在使用 javascript 更改下拉选项,然后尝试通过 SelectedIndexChanged 将更改提交到服务器 - 您知道为什么不允许这样做吗?

作为一种解决方法,您可以使用 jQuery 在下拉列表中实现change() 事件,并使用 $.ajax 进行服务器端调用:

$("#ddlUser").change(function () {
    alert("write $.ajax call to call the server here...");
});

【讨论】:

  • 我想我现在只能使用客户端调用?除了你提到的使用更多的ajax。这会影响页面上的其他元素还是仅影响这些 ddls?谢谢
  • 它会影响 ASP.NET 中的所有服务器端控件。您绝对不会“锁定”使用客户端代码。您始终可以在 ddlDepartment 上创建 OnSelectedIndexChanged 并从服务器端绑定 ddlUser。如果你这样做然后你可以为 ddlUser 调用 OnSelectedIndexChanged 并且过滤的下拉列表完全在服务器端完成
  • 不幸的是,部门 ddl 也填充了客户端。这些下拉菜单的原因是根据 ddl 中的选择用户更改网格视图中的数据。如果我错了,请纠正我,但 WebMethods 需要是静态的,并且您不能从静态方法引用控件?非常感谢
  • 好吧,ddl 是在客户端填充的,只是因为您以这种方式对其进行了编程。最重要的是,它不必是那种方式。您可以在后面的代码中完成所有数据绑定不会有无法调用 OnSelectedIndexChanged 的​​问题,如果您要在客户端进行数据绑定,那么您需要响应从 javascript 下拉更改事件,这很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多