2016-05-03 3 views
0

ich in page1.aspx webform haben:Wie Request.Form verwenden, um Daten aus einem Text in vorherigen Seite zu gelangen

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

So in Page2.aspx Ich versuche, den Wert von txtPassCode1, abzurufen, aber Ich weiß nicht, wie ich es finde, also finde ich diesen Code und lege ihn in Page_Load event von page2.aspx code hinter, ich denke im Grunde zeigt er alle POST-Daten von der Seite1 an, also setze ich "-END-" am Ende von jedem Request.Form und zeigen Sie es zu einem Aufkleber an.

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>"; 
        }     
       } 
      } 
     } 

Lassen Sie sagen, ich 1234 in page1 eingegeben und die Taste getroffen, jetzt habe ich in Page2.aspx bin und ich diesen:

__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- 

So kann ich das viert man sehen, heißt es: ctl00$ctl00$MainContent$MainContent$txtPassCode1: 1234-END- =>1234 ist was ich will. Wie kann ich nur diesen Wert abrufen?

Ich Test lblPOST.Text = Request.Form["ctl00$ctl00$MainContent$MainContent$txtPassCode1"]; und es funktioniert, aber wird ctl00$ctl00$MainContent$MainContent$txtPassCode1 immer gleich bleiben oder es wird sich ändern?

+0

Sie können das gleiche wie 'txtPassCode1.UniqueID' bekommen, aber ja, es sollte das gleiche sein. Es wird geändert, wenn die Reihenfolge der Steuerelemente geändert wird (z. B. ctl00 ist das erste Steuerelement. Wenn sich die Reihenfolge ändert, wird es ctl01). Und in der Theorie könnte es in einigen .NET-Versionen nie geändert werden. Sie können UniqueID von PreviousPage in der Sitzung speichern und dann wiederverwenden –

+0

Ich möchte keine Session verwenden, sonst lege ich einfach den Wert von Textfeld zu Sitzung und nicht um POST oder ID oder etwas anderes wirklich kümmern. –

Antwort

1

Mit der Eigenschaft PreviousPage können Sie die Daten der Quellseite von der Zielseite abrufen.

In page1 können Sie ein Password1 öffentliches Eigentum definieren:

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

, dass der Klassenname der page1 Form Page1 ist Angenommen, können Sie dies in den Page_Load von page2:

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


UPDATE

Um es aus dem Request.Form zu bekommen, könnte die mangelnde ID in ihre verschiedenen "Teile" aufgeteilt werden. Die folgende Methode kann den richtigen Wert zurückgeben, wenn das Steuerelement das einzige Formular mit dem angegebenen Namen ist (dh kein Namenscontainer wie eine GridView-Zeile oder ein ListView-Element hat ein anderes Steuerelement mit derselben 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; 
} 

Diese Methode könnte erweitert werden, um ein Array von Steuerelement-IDs als Argumente zu akzeptieren und zu testen, ob die ID-Sequenz mit den letzten "Tokens" des Schlüssels übereinstimmt. Das würde es ermöglichen, Kontrollen in Containern zu finden.

+0

Gibt es also sowieso die 'Request.Form' anstatt die' PreviousPage' zu ​​finden? –

+0

Ich sehe was du da gemacht hast. Eine letzte Frage (Sie können einfach im Kommentarabschnitt antworten oder zur Antwort hinzufügen): Ich möchte einige Passcode-Validierungen in 'page1' machen, bevor ich zu' page2' gehe, aber dazu kann ich 'PostBackUrl' nicht verwenden, aber ein onlick-Ereignis statt, dann verwende ich 'Respond.Redirect (" page2.aspx); ". Funktioniert' PreviousPage 'oder' Request.Form' noch oder werden sie 'null'? –

+0

Nach der' Antwort.Redirect', 'PreviousPage' ist null und ich bekomme die Daten nicht in' Request.Form'. Da Sie jedoch die Weiterleitung steuern, können Sie eine Abfragezeichenfolge anhängen: 'Response.Redirect (" page2.aspx? Pwd = ... ")'. Ich nehme an, dass der Passwortwert verschlüsselt und/oder verschlüsselt werden müsste. Oder Sie könnten 'Session' verwenden ... :-) – ConnorsFan

Verwandte Themen