2012-01-03 11 views
5

Dlaczego następujące wyniki powodują klauzulę true, nawet jeśli pole tekstowe jest puste i nie zostało nawet dotknięte odświeżeniem? :Kiedy jest Request.Form ["name"] null i kiedy pusty ciąg znaków?

<form action="Default.aspx" runat="server" method="post" id="newform"> 
<input type="text" id="name" runat="server"/> 
</form> 

<% 
if (Request.Form["name"] != null) // Prints out "Name OK" on postback. 
{ 
    Response.Write("<br/>"); 
    Response.Write("Name OK"); 
} 
%> 

Czy pole tekstowe zawiera pusty ciąg ("") na poczcie zwrotnej?


Dlaczego następujące czynności powodują, że klauzula true na pierwszym ładowaniu strony, ale nie na odświeżenie strony? :

<form action="Default.aspx" runat="server" method="post" id="newform"> 
<input type="text" id="name" runat="server"/> 
</form> 

<% 
if (Request.Form["name"] != "") // Prints out "Name OK" on first page load, but not on postback. 
{ 
    Response.Write("<br/>"); 
    Response.Write("Name OK"); 
} 
%> 

Aby uzyskać udane i oczekiwany wynik muszę użyć następujących:

<form action="Default.aspx" runat="server" method="post" id="newform"> 
<input type="text" id="name" runat="server"/> 
</form> 

<% 
if (Request.Form["name"] != null && Request.Form["name"] != "") 
{ 
    Response.Write("<br/>"); 
    Response.Write("Name OK"); 
} 
%> 
+0

wyłączyć auto przyjazne URL w ASP.NET 4.5 http://stackoverflow.com/a/40650127/184572 –

Odpowiedz

10

Po pierwsze, pozwól mi odpowiedzieć na pytanie:

Pierwsze obciążenie strona jest GET, POST są postbacks (stąd nazwa po z powrotem). Request.Form jest wypełnione tylko, jeśli strona jest załadowana za pomocą formularza POST.

  • Na pierwszym ładowaniu strony, Request.Form jest pustym zbiorem. Od Request.Form jest NameValueCollection, accessing a non-existent entry returns null. W ten sposób Request.Form["whatever"] zwraca na pierwszym ładowaniu strony.

  • Po odświeżeniu strony, Request.Form jest wypełniony wartościami. Ponieważ HTTP POST nie zna wartości null, zwraca pusty łańcuch dla pól, które są obecne, ale puste.

Jeśli chcesz uniknąć wzór x != null && x != "" użyć String.IsNullOrEmpty lub null coalescing operator: (x ?? "") != "".


Z drugiej strony, można uczynić swoje życie o wiele łatwiej po prostu za pomocą wbudowanego w WebForms możliwości zamiast analizowania Request.Form siebie:

<form runat="server"> 
    <asp:TextBox ID="nameBox" runat="server" /> 
    <asp:Button Text="Do Postback" runat="server" /> 
</form> 

<% 
    if (nameBox.Text != "") 
    { 
     %><br />Name OK<% 
    } 
%> 

Rejestracja TextBox.Text domyślne do "", tutaj nie ma potrzeby sprawdzania, czy nie jest to null.

+0

Dziękuję za odpowiedź na moje pytanie, ale odpowiedź nie dotycząca mojego pytania/problemu była niepotrzebna, ponieważ już wiem o wbudowanych funkcjach WebForms (to był powód, dla którego nie włączyłem tagu WebForms, ale musiałem to później) You może zastanawiasz się, dlaczego nie używam MVC zamiast tego, ale jest na to prosta odpowiedź: Nauka HTML/javascript od zera + MONO. – Birdman

+0

@Alex: Ach, ok, rozumiem. W każdym razie zostawiam tam drugą część, na wszelki wypadek, może to być pomocne dla kogoś, kto przeczyta to pytanie w przyszłości. – Heinzi

2

Request.Form jest NameValueCollection, która zwraca null jeśli określony key nie zostanie znaleziony, zwraca wartość (która jest pusta ciąg) w przeciwnym razie.

Możesz użyć metody string.IsNullOrEmpty().

if (!string.IsNullOrEmpty(Request.Form["name"])) 
{ 
    Response.Write("<br/>"); 
    Response.Write("Name OK"); 
} 
2

Request.Form["ControlName"] zwraca null jeśli kontrola nie jest obecna w formularzu.

Jeśli kontrola jest obecna, ale zawiera null lub pustą wartość, wtedy Request.Form["ControlName"] zawsze zwróci String.Empty.

Więc jest to dobra praktyka, zamiast porównywania (Request.Form["ControlName"] != null) użyć (!String.IsNullOrEmpty(Request.Form["ControlName"]))

+0

Hi @NSNoob, dlaczego zwraca wartość null, jeśli formant nie występuje w formularzu i dołącza do strony zewnętrznej na stronie –

Powiązane problemy