2012-01-03 9 views
5

¿Por qué los siguientes resultados en una verdadera cláusula if aunque el cuadro de texto está vacío y ni siquiera tocado en una devolución de datos? :¿Cuándo es nulo Request.Form ["name"] y una cadena vacía?

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

¿El cuadro de texto en realidad contiene una cadena vacía ("") en una devolución de datos?


¿Por qué el siguiente resultado en un cierto si la cláusula en la primera carga de la página, pero no en una devolución de datos? :

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

para obtener un resultado exitoso y se esperaba que tengo que utilizar los siguientes:

<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

desactivar URL amigable automático en asp.net 4.5 http://stackoverflow.com/a/40650127/184572 –

Respuesta

10

En primer lugar, permítame responder a su pregunta:

La primera carga de la página es un GET, las devoluciones de datos son un POST (de ahí el nombre posterior espalda). Request.Form se rellena solo si la página se carga a través de un formulario POST.

  • En la primera carga de la página, Request.Form es una colección vacía. Desde Request.Form es un NameValueCollection, accessing a non-existent entry returns null. Por lo tanto, Request.Form["whatever"] devuelve null en la carga de la primera página.

  • Después de una devolución de datos, Request.Form está lleno de valores. Como HTTP POST no conoce los valores null, Request.Form["whatever"] devuelve una cadena vacía para los campos que están presentes pero vacíos.

Si se quiere evitar el patrón x != null && x != "", utilice String.IsNullOrEmpty o la null coalescing operator: (x ?? "") != "".


Por otra parte, usted podría hacer su vida mucho más fácil simplemente usando los WebForms características incorporadas en lugar de analizar Request.Form mismo:

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

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

Desde TextBox.Text defecto "", no es necesario verificar null aquí.

+0

gracias por responder a mi pregunta, pero la respuesta no relacionada con mi pregunta/problema era innecesaria ya que ya sabía sobre las funciones integradas de WebForms (Esa también fue la razón por la que no incluí la etiqueta de WebForms en primer lugar, pero tuve que hacerlo más adelante) Usted Me pregunto por qué no estoy usando MVC, pero hay una respuesta fácil a eso: Aprender HTML/JavaScript desde cero + MONO. – Birdman

+0

@Alex: Ah, vale, lo entiendo. Dejaré la segunda parte allí de todos modos, por si acaso sería útil que alguien lea la pregunta en el futuro. – Heinzi

2

Request.Form es NameValueCollection, que devuelve null Si se especifica key no se encuentra, devuelve el valor (que es un vacío cadena) de lo contrario.

Puede usar el método string.IsNullOrEmpty().

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

Request.Form["ControlName"] devuelve null si el control no está presente en el formulario.

Si Control está presente, pero contiene null o valor vacío, entonces Request.Form["ControlName"] siempre devolverá String.Empty.

Por lo tanto, es una buena práctica, en lugar de comparar (Request.Form["ControlName"] != null), utilice (!String.IsNullOrEmpty(Request.Form["ControlName"]))

+0

Hola @NSNoob, por qué su retorno es nulo si el control no está presente dentro del formulario y se agrega al exterior en una página –

Cuestiones relacionadas