2011-04-11 118 views
1

我有两个dropdowlists 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 = “ - 选择 - ”

我没有得到的原因所在。尽管我已经从projecttypeID的级联下拉列表中加载了项目名称,但是,无论我选择ddprojectname的任何值,它都会得到“--select--”...

为什么会发生这种情况?

+0

只是一个预感 - 注释填充'---- select ---'选项的行。现在选定的价值是多少? – 2011-04-11 11:40:46

回答

0

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

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

+0

@maple lemme在几分钟内检查出来。它真的很麻烦。尽管这不应该让人喜欢...导致下拉列表的流程如下所示: 1.选择项目类型ID 2.项目类型ID发送到Webservice: 3. Webservice通过ajax填充ddprojectnames。 4.下拉菜单显示所有具有projectTypeId ='1'的名称 5.我尝试选择ProjectID 6.现在,我单击按钮,将项目ID分配给scdetails.ProjectID = ddProjectName.SelectedItem.Value – Joy 2011-04-11 11:55:24

+0

也许你应该尝试在你走路前爬行。很显然,回发后ViewState在服务器端没有正确更新。要创建最简单的场景,您应该从更新面板中调用回发的服务器端事件填充ddProjectName下拉列表。您应该能够将javascript ajax调用中的业务逻辑移至服务器端事件,然后查看填充ViewState是否有所帮助。如果是这样的话,那么问题就出现在你的javascript ajax调用中。 – 2011-04-11 12:17:30

+0

@maple是的,我很同意这一点。我已经成功地通过从服务器端事件做到了这一点。我想你知道我们为什么不使用ajax更新面板..因为它的视图状态很重。即使我知道由于客户端交互的可能性,视图状态不会从jquery ajax调用中填充。这就是为什么我试图找出上述事件发生的原因。因为我无能为力,为什么它不会发生从塞雷尔事件引起的完全正常的逻辑我描述和情景我实现:) – Joy 2011-04-11 13:22:52

0

你试试:

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

的DrpDwnList的ID可能会在客户端,如果您使用的是母版页或某事而改变。

+0

选择器$('[id * =“ddProjectTypeID”]')正在工作罚款。我不能使用该caz它的外部Js文件。尽管它不应该做太多diffrence.cause我已经看到ddprojectnames填充在页面中,但html源代码显示为: