Javascript ASP.NET dropdownlist在服务器按钮中为空。\u单击,ddl将填充到客户端

Javascript ASP.NET dropdownlist在服务器按钮中为空。\u单击,ddl将填充到客户端,javascript,c#,jquery,asp.net,Javascript,C#,Jquery,Asp.net,我有一张表格来更改一些地址信息。在文本框中放入一些通用邮政编码时,会触发一个客户端事件,以使用兼容城市填充dropdownlist 填充是正确的,问题是无论我选择哪个值,因为当我单击按钮保存数据时,服务器功能中的dropdownlist按钮单击haveSelectedItem to null,将aso列表项计数设为0 我放置了另一个dropdownlist只是为了测试,其中包含一些随机城市,如果我使用相同的jquery函数对其设置一个值,我可以在服务器函数中正确地看到它,因此问题似乎在于另一个是

我有一张表格来更改一些地址信息。在文本框中放入一些
通用邮政编码时,会触发一个客户端事件,以使用兼容城市填充dropdownlist

填充是正确的,问题是无论我选择哪个值,因为当我单击按钮保存数据时,服务器功能中的dropdownlist
按钮单击
have
SelectedItem to null
,将aso列表项计数设为0

我放置了另一个dropdownlist只是为了测试,其中包含一些随机城市,如果我使用相同的jquery函数对其设置一个值,我可以在服务器函数中正确地看到它,因此问题似乎在于另一个是在客户端填充的

我已经看到了这一点:以及设置隐藏字段值的解决方法,但我想知道是否有更正确的方法来实现这一点

<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();
    (...)
}

地址
省份
城市
ZIP
$(函数(){ $(document).on('keyup','input[id*='txtZIP']),function(){ var输入=$(此); 如果(输入[0]。选择开始==5){ $.ajax({ 类型:“POST”, contentType:“应用程序/json;字符集=utf-8”, url:“CleanAddress.aspx/txtZIP_TextChanged”, 数据:“{ZIP:'”+input.val()+“}”, 数据类型:“json”, 成功:功能(响应){ var cities=$.parseJSON(JSON.stringify(response.d)); 如果(comuni.length>0){ $(“[id*=txtProvince]”val(城市[0].id_省); $(“[id*='ddlCity']”。空(); $。每个(城市、功能(键、值){ $(“[id*='ddlCity']”)。追加($(“ val(value.ID_CITY).text(value.CITY)); }); $(“[id*='ddlCity']”)。removeAttr('disabled'); $(“[id*='ddlTest']”).val(9);//仅用于测试 $(“[id*='ddlComuneDom']”)val(cities[0].id_CITY); //警报($(“[id*='ddlTest']”).val(); //警报($(“[id*='ddlCity']”).val(); } } }, 错误:函数(结果){ 警报(“错误!”+result.status+“-”+result.statusText); } }); } }); [网络方法] 公共静态列表txtZIP_TextChanged(字符串ZIP) { 尝试 { 列表城市=新列表(); 如果((ZIP.Trim()!=“”)和&(ZIP.Length==5)) { dcListCitiesDataContext dc=新的dcListCitiesDataContext(); if(dc.Cities.Where(c=>c.ZIP.Equals(ZIP)).Count()>0) { 字符串province=dc.Cities.Where(c=>c.ZIP.Equals(ZIP)).First().ID_province.ToUpper(); 如果(省!=null) { cities=dc.cities.Where(c=>c.ZIP.Equals(ZIP)).ToList(); 回归城市; } } } 回归城市; } 捕获(例外情况除外) { WriteLog(“CleanAddress-txtZIP_TextChanged”+“-”+例如消息,TipoLog.Error); 投 } } 受保护的void btnSave\u单击(对象发送者,ImageClickEventArgs e) { //在这里,我总是空荡荡的 字符串城市=”; 如果(ddlCity.SelectedItem!=null) cities=ddlCity.SelectedItem.ToString(); 其他的 cities=ddlTest.SelectedItem.ToString(); (...) }
在asp webforms中,您永远不应该将其添加到客户端的服务器端控件中。由于应用了视图状态之类的抽象,它不会很好地工作,并且可能会导致非常有趣的问题

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

如果您不喜欢此选项,请将其设置为标准选择,并且不要尝试使用服务器端控件。当您提交表单时,您应该仍然能够获得提交的值,并且它会更干净。

正如我在本文中看到的:

和服务器端:

city = hdnCity.Value;

要获取当前选定的文本,您应该执行
$(“#dropDownId:selected”).Text();
我需要服务器端和客户端的值选择器#idValue无效,而不是“”或$(“[id*='dropDownId']”)。整个页面都在更新面板中,您的第一个选项是它到目前为止的工作方式,但下拉列表被重新加载,更改了ZIP文本框或省文本框,反之亦然,因此即使部分回发也会导致“沉重”界面,也因为我正在使用的web应用程序显示了一个带轮子的框,它可以转动每次回发,这就是为什么我要使用jQuery。标准的select是一个好主意,但我在页面中有其他部分的代码,其中提到了该下拉列表,所以我想我将使用提到的HiddenField解决方法,看起来更快速。我可以告诉你如果“视图状态”处于打开状态,则最终会出现异常。这是一个非常糟糕的主意。将更新面板变小,以最大限度地减少每次部分回发中传输的数量。面板越大,响应大小越大。如果是整页,则不会是真正的部分更新。我的错误..我错了,我的意思是不是整个页面,而是整个用户控件,该控件包含地址字段。。
$("[id*='hdnCity']").val($("[id*='ddlCity'] option:selected").text());
city = hdnCity.Value;