【问题标题】:ASP.NET DropDownList JavaScript/jQuery getting selected value and populating itemsASP.NET DropDownList JavaScript/jQuery 获取选定值并填充项目
【发布时间】:2014-09-11 14:40:41
【问题描述】:

我已经坚持了 2 天了。我最初使用 HTMLSelect 元素并取得了成功,直到我意识到我不知道如何从后面的代码中为它们赋值。这是使用 HTMLSelect 元素时的代码,它使页面元素的行为符合我的要求:

<select id="cboCountry" class="autoTBComplete"/>
<select id="cboState" class="autoTBComplete" />

<script type="text/javascript">

$(document).ready(function () {

    $("#cboCountry").bind("change", ValidateCountryInput);
    $("#cboState").bind("change", ValidateStateInput);

    $.ajax({
        type: "POST",
        url: "AjaxService.asmx/GetCountryList",
        contentType: "application/json; charset=utf-8",
        data: "{}",
        datatype:"json",
        success: function (data) {
            var d = data.d
            $(d).each(function (i) {
                $('#cboCountry').append("<option value=" + d[i] + ">" + d[i] + "</option>");
            });
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
});

function ValidateCountryInput() {
    if (CheckUSAorCAN()) {
        $.ajax({
            type: "POST",
            url: "AjaxService.asmx/GetStateList",
            contentType: "application/json; charset=utf-8",
            data: "{}",
            datatype: "json",
            success: function (data) {
                var d = data.d
                $(d).each(function (i) {
                    $('#cboState').append("<option value=" + d[i] + ">" + d[i] + "</option>");
                });
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(textStatus);
            }
        });
        $("[id$='cboState']").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
    }
    else {
        $("[id$='cboState']").val("");
        $("[id$='cboState']").attr('style', "width:5%");
        $("[id$='cboState']").classname ="autotbComplete";

    };
};

function ValidateStateInput() {
    var txt = $('#cboState').val();
    if (CheckUSAorCAN()) {
        if (txt.length > 0) {
            $("[id$='cboState']").attr('style', "width:64%");
            $("[id$='cboState']").classname = "autotbComplete";
        }
        else {
            $("[id$='cboState']").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
        }
    }
    else {
        $("[id$='cboState']").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
    };       
}

function CheckUSAorCAN() {
    var txt = $('#cboCountry').val();
    txt = toAllCaps(txt);
    txt = txt.replace("([^A-Z])+");
    return "US" == txt || "USA" == txt || "UNITEDSTATES" == txt || "CANADA" == txt;
}

function toAllCaps(string) { //jQuery toUpperCase() doesn't work on strings for IE 6-10
    if (string != null) {
        var input = string.split("")
        for (i = 0; i < input.length; i++) {
            input[i] = string.charAt(i).toUpperCase()
        };
        return input.join("")
    }
    return string
};

完成该工作后,我意识到我在后面的代码中存在问题,特别是在以下函数中,我正在为元素分配值或从元素中检索值。我可以使用 Response.Params 从框中获取值,但不知道如何分配值或如何从后面的代码中隐藏/禁用该字段,因为我不能执行 cboCountry.enabled = false on从后面的代码中选择元素。如果元素是 ASP.NET DropDownList,则代码有效(注意:我从该属性中删除了不相关的字段。cbo 前缀是应用程序只是使用组合框的 WinApp 时的剩余部分)。

Private Property InputFieldsControl As CustomerDataFields
    Get
        Dim cdf As New CustomerDataFields       
        cdf.Country = cboCountry.Text
        cdf.State = cboState.Text
        Return cdf
    End Get
    Set(ByVal cdf As CustomerDataFields)

        If Not cboCountry.Items.Contains(New ListItem(cdf.Country)) Then
            cboCountry.Items.Add(cdf.Country)
        End If
        cboCountry.Text = cdf.Country

        If Not cboState.Items.Contains(New ListItem(cdf.State)) Then
            cboState.Items.Add(cdf.State)
        End If
        cboState.Text = cdf.State
    End Set
End Property

因为意识到 HTMLSelect 元素无法与我的代码一起使用。我试图使相同的网页和 javascript 与 DropDownLists 一起使用,但没有成功。从上面更改的代码如下。注意 cmets,因为这些是新问题。特别是未触发的事件和 CheckUSAorCAN() 不断从 cboCountry 检索所选值的空值。

<asp:DropDownList Width="66%" CssClass="tbSkin" ID="cboCountry" runat="server" ></asp:DropDownList>
<asp:DropDownList Width="66%" CssClass="tbSkin" ID="cboState" runat="server" ></asp:DropDownList>

<script type="text/javascript">

$(document).ready(function () {       
    $.ajax({
        type: "POST",
        url: "AjaxService.asmx/GetCountryList",
        contentType: "application/json; charset=utf-8",
        data: "{}",
        datatype:"json",
        success: function (data) {
            var d = data.d;
            $(d).each(function (i) {
                var ddlref = document.getElementById("cphContents_InputParams_cboCountry");
               addItem(ddlref,d[i]);
            });

        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(textStatus);
        }
    });

    $("#cboCountry").bind("change", onCountryChange); //does not bind or fire the event
    $("#cboState").bind("change", onStateChange); //does not bind or fire the event

});


function onCountryChange(e) {
    if (CheckUSAorCAN()) {
        $.ajax({
            type: "POST",
            url: "AjaxService.asmx/GetStateList",
            contentType: "application/json; charset=utf-8",
            data: "{}",
            datatype: "json",
            success: function (data) {
                var d = data.d;
                $(d).each(function (i) {
                    var ddlref = document.getElementById("cphContents_InputParams_cboState");
                    addItem(ddlref, d[i]);
                });
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(textStatus);
            }
        });
        $("[id$='cboState']").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
    }
    else {
        $("[id$='cboState']").val("");
        $("[id$='cboState']").attr('style', "width:5%");
        $("[id$='cboState']").classname = "autotbComplete";
    };
};

function onStateChange(e) {
    var txt = $('#cboState').val();
    if (CheckUSAorCAN()) {
        if (txt.length > 0) {
            $("[id$='cboState']").attr('style', "width:64%");
            $("[id$='cboState']").classname = "autotbComplete";
        }
        else {
            $("[id$='cboState']").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
        };
    }
    else {
        $("[id$='cboState']").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
    };
};

function CheckUSAorCAN() {
    var txt = $('#cboCountry').val();
    var e = document.getElementById("cphContents_InputParams_cboState");
    var index = e.selectedIndex; //does not work
    var strUser = e.options[e.selectedIndex]; //does not work

    if (txt != null) { //always comes up null
        txt = toAllCaps(txt);
        txt = txt.replace("([^A-Z])+");
        return "US" == txt || "USA" == txt || "UNITEDSTATES" == txt || "CANADA" == txt;
    }
    return false;
};

function addItem(ddlref, item) {
    var option1 = document.createElement("option");
    option1.text = item;
    option1.value = item;
    ddlref.options.add(option1);
};

因为通过 jQuery 绑定后更改事件没有触发,所以我将它们绑定在标记代码中,如下所示:

<asp:DropDownList Width="66%" CssClass="autoTBComplete" ID="cboCountry" runat="server" onchange="onCountryChange()"></asp:DropDownList>

然而,现在 onCountryChange() 确实触发了,但是 cboCountry 中的值对于 CheckUSAorCAN() 函数来说什么都没有返回。

我没有想法。我该如何完成这项工作?

编辑:如果我在 HTMLSelect 标记上设置 runat="server" 以便我可以从后面的代码访问它,它的作用与 DropDownList 相同,除非我在标记。然后每次选择的值为null,就像DropDownList一样

【问题讨论】:

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


    【解决方案1】:

    终于搞定了。我使用类名而不是 jQuery 的 ID。这是供将来参考的工作代码以及来自谷歌的其他代码。

    标记:

    <select name="cboCountry" id="cboCountry" class="autoTBComplete cboCountry" runat="server" />
    <select id="cboState" name="cboState" class="autoTBComplete cboState" runat="server" />
    

    脚本:

    <script type="text/javascript">
    
    $(document).ready(function () {
    
        $(".cboCountry").bind("change", ValidateCountryInput);
        $(".cboState").bind("change", ValidateStateInput);
    
        $.ajax({
            type: "POST",
            url: "AjaxService.asmx/GetCountryList",
            contentType: "application/json; charset=utf-8",
            data: "{}",
            datatype: "json",
            success: function (data) {
                var d = data.d
                $(d).each(function (i) {
                    $(".cboCountry").append("<option value=" + d[i] + ">" + d[i] + "</option>");
                });
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(textStatus);
            }
        });
    });
    
    function ValidateCountryInput() {
        if (CheckUSAorCAN()) {
            $.ajax({
                type: "POST",
                url: "AjaxService.asmx/GetStateList",
                contentType: "application/json; charset=utf-8",
                data: "{}",
                datatype: "json",
                success: function (data) {
                    var d = data.d
                    $(d).each(function (i) {
                        $(".cboState").append("<option value=" + d[i] + ">" + d[i] + "</option>");
                    });
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
            $(".cboState").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
        }
        else {
            $(".cboState").val("");
            $(".cboState").attr('style', "width:5%");
            $(".cboState").classname = "autotbComplete";
    
        };
    };
    
    function ValidateStateInput() {
        var txt = $('.cboState').val();
        if (CheckUSAorCAN()) {
            if (txt.length > 0) {
                $(".cboState").attr('style', "width:64%");
                $(".cboState").classname = "autotbComplete";
            }
            else {
                $(".cboState").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
            }
        }
        else {
            $(".cboState").attr('style', "background:#ffd1d1; box-shadow: 0 0 20px #ff7a7a; width:64%;");
        };
    }
    

    代码背后:

    Protected WithEvents cboCountry As Global.System.Web.UI.HtmlControls.HtmlSelect
    Protected WithEvents cboState As Global.System.Web.UI.HtmlControls.HtmlSelect
    
    
    Private Property InputFieldsControl As CustomerDataFields
        Get
            Dim cdf As New CustomerDataFields
            cdf.Country = Request.Params("ctl00$cphContents$InputParams$cboCountry")
            cdf.State = Request.Params("ctl00$cphContents$InputParams$cboState")
            Return cdf
        End Get
        Set(ByVal cdf As CustomerDataFields)
    
            If Not cboCountry.Items.Contains(New ListItem(cdf.Country)) Then
                cboCountry.Items.Add(cdf.Country)
            End If
            cboCountry.SelectedIndex = GetHTMLSelectIndex(cboCountry, cdf.Country)
    
            If Not cboState.Items.Contains(New ListItem(cdf.State)) Then
                cboState.Items.Add(cdf.State)
            End If
            cboState.SelectedIndex = GetHTMLSelectIndex(cboState, cdf.State)
    
        End Set
    End Property
    
    Private Function GetHTMLSelectIndex(elem As HtmlSelect, value As String) As Integer
        Return elem.Items().IndexOf(elem.Items.FindByText(value))
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-08
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多