Когда Request.Form ["name"] равен нулю, а когда пустая строка? - PullRequest
5 голосов
/ 03 января 2012

Почему следующий результат приводит к предложению true if, даже если текстовое поле пустое и даже не затронуто при обратной передаче? :

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

Содержит ли текстовое поле пустую строку ("") в обратной передаче?


Почему следующий результат приводит к тому, что предложение true if на первой странице загружается, а не на обратной передаче? :

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

Чтобы получить успешный и ожидаемый результат, я должен использовать следующее:

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

Ответы [ 3 ]

10 голосов
/ 03 января 2012

Сначала позвольте мне ответить на ваш вопрос:

Первая загрузка страницы - это GET, постбэки - это POST (отсюда и название post back).Request.Form заполняется только , если страница загружается через форму POST.

  • При первой загрузке страницы Request.Form - пустая коллекция.Поскольку Request.Form является NameValueCollection, , обращающийся к несуществующей записи, возвращает нуль .Таким образом, Request.Form["whatever"] возвращает null при загрузке первой страницы.

  • После обратной передачи Request.Form заполняется значениями.Поскольку HTTP POST не знает о значениях null, Request.Form["whatever"] возвращает пустую строку для полей, которые присутствуют, но пустые.

Если вы хотите избежать шаблона x != null && x != "",используйте String.IsNullOrEmpty или нуль-оператор объединения : (x ?? "") != "".


С другой стороны, вы можете многое сделать своей жизньюпроще, просто используя встроенные функции WebForms вместо синтаксического анализа Request.Form самостоятельно:

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

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

Поскольку TextBox.Text по умолчанию "", нет необходимостипроверьте null здесь.

2 голосов
/ 04 мая 2016

Request.Form["ControlName"] возвращает null, если элемент управления отсутствует в форме.

Если элемент управления присутствует, но содержит null или пустое значение, то Request.Form["ControlName"] всегда будет возвращать String.Empty.

Так что вместо сравнения (Request.Form["ControlName"] != null) рекомендуется использовать (!String.IsNullOrEmpty(Request.Form["ControlName"]))

2 голосов
/ 03 января 2012

Request.Form равно NameValueCollection , которое возвращает null, если указанное key не найдено, в противном случае возвращает значение (которое является пустой строкой).

Вы можете использовать string.IsNullOrEmpty() метод.

if (!string.IsNullOrEmpty(Request.Form["name"]))
{
  Response.Write("<br/>");
  Response.Write("Name OK");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...