2015-03-31 162 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