使用jQuery Ajax调用webmethod后控制事件未执行

时间:2014-05-29 10:05:44

标签: javascript jquery asp.net ajax vb.net

我在gridview编辑模板中使用级联下拉列表。对于绑定下拉列表,我使用了一些使用web方法调用的类,到目前为止一切正常,它是绑定下拉列表。

现在的问题是我在第二个dropdownlist选择了indexchanged事件下写了一些代码,但是它不会执行第二个下拉列表的选定索引更改事件。我设置了autopostback = true和EnableEventValidation =" false",但没有运气。

如何执行第二个下拉列表选择索引更改事件?此外,它不会执行gridview编辑模板中的任何其他控件事件。

注意:我在gridview EditTemplate中使用了所有下拉列表。

VS 2010,代码隐藏:Vb.net

这是我的代码:

//calling webmethod using JqueryAjax
var $ddl = $("select[name$=cbCompany]");
      $ddl.select2();
      var $ddlSub = $("select[name$=cbCategoryName]");

      loadSubjects($("select option:selected").val());
      $ddlSub.fadeIn("slow");

      $ddlSub.bind("change keyup", function () {

          $ddlSub.select2();

          loadSubcategroy($ddlSub.val());

          $cbSubCategoryName.fadeIn("slow");
      });
  }

  function loadSubjects(selectedItem) {

      $.ajax({
          type: "POST",
          url: "frmTimeBilling.aspx/GetSubjectList",
          data: "{deptAliasName:'" + selectedItem + "'}",
          contentType: "application/json; charset=utf-8",
          dataType: "json",
          async: true,
          success: function (data) {
              printSub(data.d);

          },
          error: function (xhr, status, err) {
              var err = eval("(" + xhr.responseText + ")");
              alert(err.Message);
          }
      });
  }

  function printSub(data) {
      $("select[name*=cbCategoryName] > option").remove();
      $("select[name*=cbCategoryName]").append(
                $("<option></option>").val("Select Subject").html("Select Subject")
                );
      for (var i = 0; i < data.length; i++) {
          $("select[name*=cbCategoryName]").append(
                    $("<option>  
    </option>").val(data[i].subAliasName).html(data[i].subName)
                );
      }
      $("#subjectdiv").css("display", "block");
      $("select[name$=cbCategoryName]").select2();
  }

下面是使用上面的jQuery Ajax方法调用的Web方法代码

<WebMethod()> _
<ScriptMethod(UseHttpGet:=False, ResponseFormat:=ResponseFormat.Json)> _
    Public Shared Function GetSubjectList(ByVal deptAliasName As String) As List(Of   

Data)
        Dim [sub] As New Data()

        Dim lstSubs As List(Of Data) = [sub].GetCategory("", "CategoryName",   

deptAliasName).ToList()
        Dim a As Integer = lstSubs.Count


        Return lstSubs
    End Function

这是使用jQuery ajax方法绑定下拉列表后未执行的事件。

 Protected Sub cbCategoryName_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

 tbName.text="Your Selected category is blah blah"

 End Sub

我做了一些更改(我在上面的代码中使用了loadSubcategroy($(&#34; select option:selected&#34;)。val());而不是loadSubcategroy($ ddlSub.val());)点击selectedindex_changed事件。但现在回发后的问题,它丢失了使用jQuery绑定的所有数据。

那么我如何在回发后将数据保存在下拉列表中?

1 个答案:

答案 0 :(得分:0)

根据您的评论,我的回答仍然有效。因为您正在填写客户端的下拉列表,所以ViewState不包含任何项目,因此它不会按照您的方式工作。您正在混合两个不同的平台(jQuery和.NET)。

选项1 - 将您的下拉列表包裹在UpdatePanel中,并从代码隐藏处理数据绑定。这会将ListItem放在ViewState中,这将允许您的提交按钮的事件看到值。

选项2. - 使用jQuery做所有事情。您的提交按钮可以使用Request.Form(cbCategoryName.UniqueID)获取下拉列表的值。这种方法的缺点是下拉列表不会在回发时保留其列表项。