我有一个小问题,我在我的asp.net应用程序中创建一个编辑页面,用户可以编辑对象中的属性。我有两个下拉列表(类别和组),其中组的数量取决于所选的类别。我的目标是显示正在编辑的对象的正确类别,然后加载组列表并选择正确的组 - 问题是我的selectedindexchanged事件永远不会被触发。
当我在page_load中加载我的类别并填充类别时,代码如下所示:
protected void Page_Load(object sender, EventArgs e)
{ string editid= Request["edit"] == null ? null : Request["edit"].ToString();
int id = Convert.ToInt32(editid);
if (link == null)
{
link = BLLink.Load(id, blm);
}
if (!IsPostBack)
{
group = BLGroup.Load(link.GroupId, blm);
category = BLCategory.Load(group.CategoryId, blm);
List<BLCategory> categories = BLCategory.LoadAll();
categoryDropDown.DataSource = categories;
categoryDropDown.DataTextField = "CategoryName";
categoryDropDown.DataValueField = "id";
categoryDropDown.SelectedValue = category.id.ToString(); //this one doesnt cause the event to fire??? Doesnt matter if it is called after the databind() method
categoryDropDown.DataBind();
}
}
我想要执行的事件处理程序应该加载所有组并填充下拉列表并选择正确的:
protected void categoryDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
category = BLCategory.Load(Convert.ToInt32(categoryDropDown.SelectedValue), new TestModelDataContext());
if (category != null)
{
List<BLGroup> groups = BLGroup.LoadAll(category.id);
groupDropDown.DataSource = groups;
groupDropDown.DataTextField = "GroupHeading";
groupDropDown.DataValueField = "GroupId";
groupDropDown.DataBind();
if (group != null)
{
groupDropDown.SelectedValue = group.GroupId.ToString();
}
else
{
groupDropDown.SelectedIndex = 0;
}
}
}
我不知道出了什么问题,这看起来很简单,我做错了什么?
答案 0 :(得分:0)
要触发此事件,当用户的选择发生更改时,页面需要PostBack。这将导致整个页面刷新(但控件应保留其状态)。
此SelectedIndexChanged事件正在服务器上运行,我认为当所选项目发生更改时,第一个下拉列表中有一个关于提交/回发的属性。
要获得客户端行为,您可以做两件事:
1)在UpdatePanel中包装该部分,并在第一个值的更改时刷新第二个列表
2)使用JavaScript客户端代码加载值,当所选值在第一个上更改时触发,检索列表并填充第二个
2a)您可以编写一个包含对数据源的调用的服务,并将值作为JSON等返回,或者
2b)您可以将每个可能选择的所有值填充到隐藏字段中,这些字段在某个方面由第一个框中的值以某种方式标识(这是不可取的,但可能取决于数据集的安全性和大小)
选项1可能是保留现有代码库并仍然获得客户端行为的最直接方式。