【问题标题】:Get POST Values in ASP.NET using NameValueCollection使用 NameValueCollection 在 ASP.NET 中获取 POST 值
【发布时间】:2012-08-20 22:36:24
【问题描述】:

所以我有 2 页。它们都具有相同的母版页,并且是相同 Web 应用程序的一部分。我正在尝试将一个页面提交给另一个页面。在提交页面上,我有一些元素,例如

<ajaxToolkit:ComboBox ID="cmboOptions" AutoCompleteMode="SuggestAppend"
CaseSensitive="false" ItemInsertLocation="Append" runat="server" DropDownStyle="DropDownList">
    <asp:ListItem></asp:ListItem>
    <asp:ListItem Text="Option 1" Value="opt1"></asp:ListItem>
    <asp:ListItem Text="Option 2" Value="opt2"></asp:ListItem>
</ajaxToolkit:ComboBox>

我正在使用

<asp:Button ID="btnSubmit" runat="server" Text="Submit" 
PostBackUrl="~/Results.aspx" />

提交页面。

在页面加载后面的代码中的结果页面上我有

NameValueCollection nvc = Request.Form;
string selectedOption = nvc["cmboOptions"];

如果我在调试时查看 NVC,我可以看到

ctl00$MainContent$cmboOptions$TextBox

值为“选项 1”,但我的字符串仍包含 null 值。我什至不想通过硬编码混淆的 ID 来获取值,而且我无法在 ASP.net 元素上设置名称属性。

有没有人知道更好/正确的方法来完成我正在做的事情?我想坚持使用 ajaxControlToolkit 组合框,因为它们对用户很好,尽管我希望我坚持使用 jQuery 而不是听我的朋友的话,现在切换为时已晚。

我看这里没有任何运气

Get POST data in C#/ASP.NET

这里

Read Post Data submitted to ASP.Net Form

这里

http://msdn.microsoft.com/en-us/library/6c3yckfw.aspx

我尝试了 PreviousPage.FindControl,但我总是得到 null。

感谢您的宝贵时间!

编辑:

避免使用 AjaxControlToolKit。如果您想偷懒并拖放甜蜜的 UI 元素,那就太好了,但让简单的事情正常工作只是一件令人头疼的事情!使用 jQuery。

【问题讨论】:

  • 您的代码似乎没问题,问题可能是由 ajax 组合框引起的,尝试任何 asp 控件来检查您的代码。也可以尝试我在回答中提到的上一页。
  • 检查我更新的答案,它正在工作。

标签: asp.net forms post submit namevaluecollection


【解决方案1】:

我认为你必须使用Page.PreviousPage 属性 您可以将下拉值设为

if (Page.PreviousPage != null)
{
   DropDownList ddl= (DropDownList)Page.PreviousPage.FindControl("cmboOptions$cmboOptions_TextBox");
   // You have an AjaxToolkit Combo Box, so you must cast it as
   AjaxToolKit.ComboBox ddl= (AjaxToolKit.ComboBox )Page.PreviousPage.FindControl("cmboOptions"); 
   if (ddl != null)
   {
      // do your work
   }
}

在 msdn 上阅读有关 Cross Page Posting in Asp.net 的更多信息

更新答案: 为了检查史蒂夫代码,我创建了一个带有下拉列表和一个按钮来回发的页面(目前我没有 ajaxtoolkit,所以我使用的是下拉列表)

<asp:DropDownList ID="ddl" runat="server"  >
    <asp:ListItem></asp:ListItem>
      <asp:ListItem Text="Option 1" Value="opt1"  > </asp:ListItem>
      <asp:ListItem Text="Option 2" Value="opt2"  ></asp:ListItem>
</asp:DropDownList>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" 
    PostBackUrl="~/Default4.aspx" />
 // This code was written on Default5.aspx

 // Default4.aspx code behind
protected void Page_Load(object sender, EventArgs e)
{
    NameValueCollection nvc = Request.Form;
    string val = Request.Form["ddl"];
    string val2 = nvc["ddl"];
    // Both above statement returns the required result
}

所以,我认为问题出在 Ajax 组合框上。(如果您没有做错任何事情)

更新答案: 问题是我们发布页面时更改了 Ajax Combo box 控件的 ID。在 Next 页面中,我们可以获取 ajax 组合框的 ID 为

对于没有母版页的页面: 如果您使用的是没有母版页的 aspx 页面,那么您可以将 ajax 组合框的 ID 获取为

     //Ajax Combo Box ID format
     ComboBoxID + "$TextBox" 
     // so If I have a combo box with ID ComboBox1 it becomes
     ComboBox1$TextBox
     so we will get the value as
     string comboBoxvalue = Request.Form["ComboBox1$TextBox"];
                   or
     NameValueCollection nvc = Request.Form;
     string cmbvalue = nvc["ComboBox1$TextBox"];

对于使用 MasterPages 的页面:

    //Ajax Combo Box ID format
    "ctl00$" + ContentPlaceHolderID +"$" + ComboBoxID + "$TextBox"
    //I have a combox Box with ID ComboBox1 and ContentPlaceHolderID ContentPlaceHolder1
    so AjaxComboBox ID becomes ctl00$ContentPlaceHolder1$ComboBox1$TextBox

    string cmbvalue = nvc["ctl00$ContentPlaceHolder1$ComboBox1$TextBox"];

    // In your case
   // ComboxBox ID is cmboOptions  and ContentPlaceHolderID is MainContent
    // so your ID becomes
    ctl00$MainContent$cmboOptions$TextBox
    // so you will get the data as
     string cmbvalue = nvc[" ctl00$MainContent$cmboOptions$TextBox"];

【讨论】:

  • 这个我已经试过了。运气不好:(。那个链接几乎和我发布的那个链接一样,我尝试了那里的所有东西都没有运气:(
  • 有什么错误吗?当您按下按钮时,您在组合框中选择了一个项目?
  • @Steve 请将 ajaxToolkit:ComboBox 替换为下拉列表并检查您的代码,如果您的代码有效,则说明问题出在 ajax ComboBox 上。我检查了你的代码,它适用于 asp 下拉列表,所以可能的问题是 ajax 组合框。请确认。谢谢
  • 好的,我会在接下来的一两天内尝试并发布结果。
  • 我确实可以验证这是否完全按预期工作。 ct100$ 会一直保持不变吗?我要避免的一件事是未来的问题,因为生成的值会发生变化,并且我已将其硬编码。另外,感谢您在此答案中投入了大量工作!那就是乐于助人!
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多