如何在不使用UpdatePanel的情况下从动态填充的下拉列表中获得POSTed值



我有一个依赖于母版页的Web表单,它包含一个简单的表单,如下所示:

<asp:TextBox runat="server" ID="txtValue"></asp:TextBox>    
<asp:DropDownList runat="server" ID="ddlProduct" />
<asp:Button runat="server" ID="btnConfirm" Text="Confirm" OnClick="btnConfirm_OnClick" />

在Page_Load上,我用值动态填充DropDownList:

foreach(var product in products)
{
ListItem item = new ListItem(product.Nazev, product.ProductId.ToString());
ddlProduct.Items.Add(item);
}

现在。。通常,如果DropDownList是静态填充的,我会这样做,从中得到我选择的值:

protected void btnConfirm_OnClick(object sender, EventArgs e)
{
string selectedProduct = ddlProduct.SelectedValue;
}

但在这种情况下,这是不可能的。因此,我试图用其中一种方法(实际上是相同的(直接从POSTed参数中获得选定的值:

protected void btnConfirm_OnClick(object sender, EventArgs e)
{
string selectedProduct = Request.Form.Get(ddlProdukt.ClientID);
string selectedProduct2 = Request.Params[ddlProdukt.ClientID];
}

但它不起作用。如果我调试它,POSTed表单(Request.Params(中DropDownList的实际"id/name"是:

"ctl00$MainContent$ddlProdukt">

而我的方法给我的ClientId是:

"ctl00_MainContent_ddlProdukt">

我不明白,为什么它把DDL控件ID中的"_"替换为"$"。。这似乎是一件微不足道的事情。应该有比替换字符更好的方法来找到正确的ID,对吧?

有没有其他方法可以让我"查找/询问"所选的值?

*考虑到,我不是在寻找一个更新面板的解决方案。我知道,使用UpdatePanel会导致在Postback之后成功地选择DDL值,但这不是我在这里寻找的答案。

感谢您的意见。

如果您仍然需要使用Request.Form.GetRequest.Params,您应该在ddlProdukt.UniqueID上调用它,因为它的分隔符是'$',而在.ClientID上是'_'

根据请求提供一个示例。此代码和<asp:DropDownList ID="ddlProduct" runat="server"></asp:DropDownList>位于aspx页面上,而不是母版上。

protected void Page_Load(object sender, EventArgs e)
{
//bind data not here
if (IsPostBack == false)
{
//but inside the ispostback check
ddlProduct.Items.Add(new ListItem("Item 1", "1"));
ddlProduct.Items.Add(new ListItem("Item 2", "2"));
ddlProduct.Items.Add(new ListItem("Item 3", "3"));
ddlProduct.DataBind();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = ddlProduct.SelectedValue;
}

最新更新