如何使用Request.Form从上一页的TextBox中获取数据

时间:2016-05-03 20:02:26

标签: c# asp.net post webforms http-post

我有page1.aspx webform:

<asp:TextBox runat="server" ID="txtPassCode1" TextMode="Password"></asp:TextBox>
<asp:Button runat="server" ID="btnTakeTest1" Text="Go to page 2" PostBackUrl="page2.aspx" />

所以在page2.aspx中,我正在尝试检索txtPassCode1的值,但我不知道如何找到它,所以我找到了这段代码并将其放在page2的Page_Load事件中。 aspx代码背后,我认为它基本上显示了来自page1的所有POST数据,所以我把&#34; -END - &#34;在每个Request.Form的末尾,并将其显示为标签。

protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack && Request.RequestType == "POST")
            {
                if (Request.Form != null && Request.Form.Keys.Count > 0)
                {
                    string[] keys = Request.Form.AllKeys;
                    for (int i = 0; i < keys.Length; i++)
                    {
                        lblPOST.Text = lblPOST.Text + keys[i] + ": " + Request.Form[keys[i]] + " -END- <br>";
                    }                  
                }
            }
        } 

假设我在第1页输入了1234并点击了按钮,现在我在page2.aspx中,我得到了这个:

__EVENTTARGET: -END- 
__EVENTARGUMENT: -END- 
__VIEWSTATE: YznkkVzGlJ8TtCKM2Vzx7+DEhiSoaItNvqFaqJKJYPoMTZu7jerq3btXp1r0iob13dEaKV1fSheRySmdCl69U5KRukE4bi2gD68nYOoj0f93ysiTufpvcr4j1t09lMDwjfuQDmVuJqrDlyzEffG+IkOQfdNEn1sAukVwGBwzCGI= -END- 
ctl00$ctl00$MainContent$MainContent$txtPassCode1: 1234-END- 
ctl00$ctl00$MainContent$MainContent$btnTakeTest1: Take this test -END- 
ctl00$ctl00$MainContent$MainContent$txtPassCode2: -END- 
__VIEWSTATEGENERATOR: 22DEEF5F -END- 
__PREVIOUSPAGE: OQ8E2uts0p1smCGF7aTw5vs7Ykqr-CAG0J7QCt87boTAs4TxBB2hkHCK_tPL2nCs45bS9uR7NMxjva1XFW7DDI4_CO2Mt84c8cQu_1Yo1gDenS9hrXC5wlh3iaO-Ftv_0 -END- 
__EVENTVALIDATION: LpMm3Lf2/xeGRstUHMr5WL79abGTpD92nJ/Ltwjsluwt0J7CmS72WqREhKn4x4jz8zvliCoBOxOAc8VhdKHRYajTycLpjxwSu9iEEWR92JvTYsHvKU9qCq1Z95thv0y9TeUW0mHMRqfOA8Pcd4cpYEL7oT2Iq+l+p2JiDFTTyr8yC28WtWj+E1vP018j3+qt -END- 

所以我可以看到它说的第4个:ctl00$ctl00$MainContent$MainContent$txtPassCode1: 1234-END- =&GT; 1234是我想要的。如何仅检索此值?

我测试 lblPOST.Text = Request.Form["ctl00$ctl00$MainContent$MainContent$txtPassCode1"];它有效,但ctl00$ctl00$MainContent$MainContent$txtPassCode1会保持不变还是会改变?

1 个答案:

答案 0 :(得分:1)

PreviousPage属性允许您从目标页面检索源页面的数据。

在第1页中,您可以定义Password1公共属性:

public string Password1
{
    get { return txtPassCode1.Text; }
}

假设page1表单的类名是Page1,您可以在第2页的Page_Load中执行此操作:

protected void Page_Load(object sender, EventArgs e)
{
    Page1 source = PreviousPage as Page1;
    if (source != null)
    {
        string password = source.Password1;
        ...
    }
}


更新

为了从Request.Form中获取它,可以将损坏的ID拆分为各种各样的部分&#34;。如果控件是具有给定名称的表单中的唯一控件(意味着没有命名容器,如GridView行或ListView项具有另一个具有相同ID的控件),则以下方法可以返回正确的值:

string password = GetPreviousPageControlValue("txtPassCode1");

private string GetPreviousPageControlValue(string ctlId)
{
    foreach (string key in Request.Form.AllKeys)
    {
        string[] tokens = key.Split('$');
        if (tokens[tokens.Length - 1] == ctlId)
        {
            return Request.Form[key];
        }
    }
    return null;
}

可以扩展此方法以接受控件ID数组作为参数,并测试ID序列是否与最后一个&#34;令牌匹配。关键。这样就可以在容器中找到控件。