2015-03-31 164 views
1

我有一个表单来更改一些地址信息。当在文本框中放置一些generic ZIP code时,会触发客户端事件来填充兼容城市的下拉列表。ASP.NET下拉列表在服务器button_click中为空,ddl填充客户端

填充是正确的,问题是无论我选择哪个值之后,因为当我点击按钮来保存数据时,服务器功能button_click中的下拉列表有SelectedItem to null,有aso列表项计数为0 ..

我已经把另一个下拉列表仅仅用于测试,其中有一些随机的城市,如果我通过相同的jquery函数设置一个值,我可以正确地在服务器功能中看到它,所以问题似乎是事实上,另一个是填充客户端..

我见过这个:Asp.Net: Restoring client-side SelectedItem of DropDownList on server-side和设置隐藏字段值的解决方法,但我想知道如果有更正确的方法来做到这一点..

<table> 
    <tr> 
     <td> 
      <label>Address</label><br /> 
      <asp:TextBox ID="txtAddress" CssClass="testo" runat="server"></asp:TextBox> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <label>Province</label><br /> 
      <asp:TextBox ID="txtProvince" runat="server" /> 
     </td> 
     <td> 
      <label>City</label><br /> 
      <asp:DropDownList ID="ddlCity" runat="server" /> 
     </td> 
     <td> 
      <label>ZIP</label><br /> 
      <asp:TextBox ID="txtZIP" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <!-- Just for test set ddl by jQuery --> 
      <asp:DropDownList ID="ddlTest" runat="server" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <asp:ImageButton ID="btnSave" runat="server" 
       OnClick="btnSave_Click" /> 
     </td> 
    </tr> 
</table> 

$(function() { 

    $(document).on('keyup', 'input[id*="txtZIP"]', function() { 
     var input = $(this); 
     if (input[0].selectionStart == 5) { 
      $.ajax({ 
       type: "POST", 
       contentType: "application/json; charset=utf-8", 
       url: "CleanAddress.aspx/txtZIP_TextChanged", 
       data: "{ZIP:'" + input.val() + "'}", 
       dataType: "json", 
       success: function (response) { 
        var cities = $.parseJSON(JSON.stringify(response.d)); 
        if (comuni.length > 0) { 
         $("[id*=txtProvince]").val(cities[0].ID_PROVINCE); 
         $("[id*='ddlCity']").empty(); 
         $.each(cities, function (key, value) { 
          $("[id*='ddlCity']").append($("<option /> 
").val(value.ID_CITY).text(value.CITY)); 
         }); 
         $("[id*='ddlCity']").removeAttr('disabled'); 
         $("[id*='ddlTest']").val(9); // Just for test 
         $("[id*='ddlComuneDom']").val(cities[0].ID_CITY); 
         //alert($("[id*='ddlTest']").val()); 
         //alert($("[id*='ddlCity']").val()); 
         } 
        } 
       }, 
       error: function (result) { 
        alert("Errore! " + result.status + " - " + result.statusText); 
       } 
      }); 
     } 
    }); 

[WebMethod] 
    public static List<Comuni> txtZIP_TextChanged(string ZIP) 
    { 
     try 
     { 
      List<Cities> cities = new List<Cities>(); 
      if ((ZIP.Trim() != "") && (ZIP.Length == 5)) 
      { 
       dcListCitiesDataContext dc = new dcListCitiesDataContext(); 

       if (dc.Cities.Where(c => c.ZIP.Equals(ZIP)).Count() > 0) 
       { 
        string province = dc.Cities.Where(c => c.ZIP.Equals(ZIP)).First().ID_PROVINCE.ToUpper(); 
        if (province != null) 
        { 
         cities = dc.Cities.Where(c => c.ZIP.Equals(ZIP)).ToList(); 
         return cities; 
        } 

       } 
      } 
      return cities; 
     } 
     catch (Exception ex) 
     { 
      Utility.WriteLog("CleanAddress - txtZIP_TextChanged " + " - " + ex.Message, TipoLog.Error); 
      throw; 
     } 
    } 

    protected void btnSave_Click(object sender, ImageClickEventArgs e) 
{ 
    // Here I've always ddlCity empty 
    string cities= ""; 
    if (ddlCity.SelectedItem != null) 
     cities= ddlCity.SelectedItem.ToString(); 
    else 
     cities= ddlTest.SelectedItem.ToString(); 
    (...) 
} 
+1

要获得当前选定的文本,你应该(';'#dropDownId:selected')。text();' – BNN 2015-03-31 10:29:14

+0

我希望价值服务器端,和客户端选择器#idValue无效,而''%= dropDown.ClientID%>'或$( “[ID * = 'dropDownId']”)。 – MisterFrank 2015-03-31 12:42:25

回答

0

在asp的webforms中,你不应该添加到客户端的服务器端控件。由于像视图状态那样应用了抽象,它不会很好地工作,并且可能会导致非常有趣的问题。

如果您需要填充列表中的“网页表单”方式,您通常会将下拉列表放置在更新面板中,并通过执行部分回发来加载它。然后你可以添加到项目中,或者在服务器端进行数据绑定来填充它。

你不喜欢这个选项,使它成为标准选择,并且不要尝试使用服务器端控件。当你提交表格时,你仍然可以获得提交的价值,而且会更清晰。

+0

整个页面位于更新面板中,您的第一个选项是直到现在它的工作方式,但下拉列表重新加载更改ZIP文本框或更改省文本框,反之亦然,因此即使部分回发结果为“重”的界面,也是因为我正在处理的Web应用程序显示一个带轮子的盒子,每转发一次,这就是我转向jQuery的原因。标准选择是一个好主意,但我有其他部分的代码在页面中引用该下拉菜单,所以我认为我要去提到的HiddenField解决方法,似乎更快。 – MisterFrank 2015-03-31 12:57:47

+0

我可以告诉你,你会如果视图状态处于打开状态,则结束异常。这是一个非常糟糕的主意。使更新面板更小,以最大限度地减少每个部分回发中传输的数量。它们越大,响应大小越大。如果是完整页面,它不会是真正的部分更新。 – Tim 2015-03-31 13:01:14

+0

我的不好..我错了,我的意思不是整个页面,而是整个用户控件,它包含地址域.. – MisterFrank 2015-03-31 13:10:28