我有两个下拉列表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--”...
为什么会这样?
答案 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
{
}
作为参考,我会给你一个非常好的博客文章,实际上已经处理了这个问题,这对我原来的问题没有帮助。
但我实际上可以找出问题所在。基本上会发生什么,当我在级联效果上使用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的级联效果改变的客户端数据。