下拉选择的值未被选中,它始终显示选择中的第一个值

时间:2011-04-11 11:27:51

标签: jquery

我有两个下拉列表ddprojecttype和ddprojectname。在选择项目类型时,我使用jQuery和AJAX将项目名填充到ddprojectname中。它只显示正确。

但是,每当我尝试在下拉列表中进行选择时,它总是选择第一个项目。而且它的行为很奇怪:当我在浏览器中查看aspx页面时,它会将所有项目名称显示在下拉列表中。而在查看来源的情况下,它根本没有显示下拉选项。

我将发布页面代码以及用于它的html和jQery脚本:

 <asp:DropDownList ID="ddProjectTypeID" runat="server" >
                    </asp:DropDownList>
<asp:DropDownList ID="ddProjectName" runat="server"  >
                    </asp:DropDownList>

成功加载项目名称的脚本的jQuery是:

$('[id*="ddProjectTypeID"]').change(function() {
    if ($(this).find(":selected").text() != "--Select--") {
        $.ajax({
            type: 'POST',
            contentType: "application/json; charset=utf-8",
            url: 'Services/Service.asmx/GetProjectNames',
            data: '{"p_type_id":"' + $(this).find(":selected").val() + '"}',
            dataType: "json",
            success: function(data, textStatus) {
                if (textStatus == "success") {
                    var myObject = data.d;
                    $('[id*="ddProjectName"] >option').remove();
                    $('[id*="ddProjectName"]').append($('<option></option>').val("--Select--").html("--Select--"));
                    for (var i = 0; i <= myObject.length - 1; i++) {
                        $('[id*="ddProjectName"]').append($('<option></option>').val(myObject[i].project_id)
                                        .html(myObject[i].project_name));
                    }
                }
            },
            error: function(data, textStatus) {
                alert('An error has occured retrieving data!');
            }
        });
    }
});

将名称成功加载到ddprojectnames下拉列表中:

奇怪的是,每当我执行此代码时:

protected void btnSubmit_Click(object sender, EventArgs e)
    {
    ScheduleDetails scdetails = new ScheduleDetails();
    scdetails.ProjectTypeID = ddProjectTypeID.SelectedItem.Value;
            scdetails.ProjectID = ddProjectName.SelectedItem.Value;


}

它只获得scdetails.ProjectTypeID = 1但是 scdetails.ProjectID =“ - Select--”

我没有理由。虽然我已经从projecttypeID的级联下拉列表中加载了项目名称,但即使这样,无论我从ddprojectname中选择任何值,它都会得到“--select--”...

为什么会这样?

3 个答案:

答案 0 :(得分:0)

我的猜测是因为ddDropDownName的列表项依赖于ID下拉列表的选择,所以可能无法在客户端生命周期中设置所选值,因为可用数据尚不存在。

尝试在页面的PreRender阶段设置一个事件,并检查下拉列表的选定值。如果它设置正确那么告诉我将此值加载到ViewState的下拉列表中是一个问题。

答案 1 :(得分:0)

你会尝试:

$("#<%=ddProjectTypeID.ClientID %>") instead of $('[id*="ddProjectTypeID"]') 

如果您正在使用母版页或其他内容,则可能会在客户端更改DrpDwnList的ID。

答案 2 :(得分:0)

基于上述事实,我所做的是一些有趣的事情,我之前没有遇到过。

对于一个实例我写了我的问题。基本上这是当您单击并从JavaScript中选择一个选项时发生的回发错误,所以您可以做的是:

创建一个基于扩展System.Web.Ui.WebControls.Dropdownlist的自定义控件,而不是使用<asp:dropdownlist>只使用它。

以下是自定义类的代码:

 public class DropDown:System.Web.UI.WebControls.DropDownList
{
}

作为参考,我会给你一个非常好的博客文章,实际上已经处理了这个问题,这对我原来的问题没有帮助。

Postback Error Blog

但我实际上可以找出问题所在。基本上会发生什么,当我在级联效果上使用jQuery AJAX填充下拉列表时。 viewstate实际上没有得到更新,因此当我单击一个按钮进行回发时,它会给出错误:

nvalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page

现在要避免我已经给出了链接。

现在解决如何获取值的问题。为此,我为页面添加了一个隐藏字段用于级联下拉列表,并将其值设置为下拉列表选择值到隐藏字段。现在点击按钮我可以从下拉列表中获取实际值(基本上是一个自定义控件),如:

$('[id*="btnSubmit"]').click(function() {
    $('[id*="hf"]').val($('[id*="ddProjectName"]').find("selected").val());
});

Note: You cannot do the textbox1.text = ddcustom.selectedvalue 

现在您可以从按钮访问该值:

protected void btnSubmit_Click(object sender, EventArgs e)
    { String Project_id= hf.value;  }

这是因为viewstate没有提供已经从jQuery AJAX的级联效果改变的客户端数据。