【问题标题】:When is Request.Form["name"] null and when an empty string?Request.Form["name"] 何时为空,何时为空字符串?
【发布时间】:2012-02-01 11:47:02
【问题描述】:

为什么即使文本框是空的并且甚至没有触及回发,下面的结果仍然是一个真 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");
}
%>

文本框是否在回发时实际上包含一个空字符串 ("")?


为什么以下结果会在第一个页面加载时产生一个真 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");
}
%>

【问题讨论】:

标签: asp.net html webforms


【解决方案1】:

Request.FormNameValueCollection,如果指定key,则返回null,否则返回值(为空字符串)。

您可以使用string.IsNullOrEmpty() 方法。

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

【讨论】:

    【解决方案2】:

    首先,让我回答你的问题:

    第一个页面加载是 GET,回发是 POST(因此名称为 postback)。 Request.Form 仅在通过表单 POST 加载页面时才被填充。

    • 在第一个页面加载时,Request.Form 是一个空集合。因为Request.FormNameValueCollectionaccessing a non-existent entry returns null。因此,Request.Form["whatever"] 在第一个页面加载时返回 null

    • 回发后,Request.Form 会填充值。由于 HTTP POST 不知道 null 的值,Request.Form["whatever"] 为存在但为空的字段返回一个空字符串。

    如果您想避免x != null &amp;&amp; x != "" 模式,请使用String.IsNullOrEmptynull coalescing operator(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

    【讨论】:

    • 感谢您回答我的问题,但与我的问题/问题无关的答案是不必要的,因为我已经知道内置的 WebForms 功能(这也是我没有包括首先是 WebForms 标记,但后来不得不这样做)您可能想知道为什么我当时不使用 MVC,但有一个简单的答案:从头开始学习 HTML/javascript + MONO。
    • @Alex:啊,好的,我明白了。无论如何,我会将第二部分留在那里,以防万一它对将来阅读该问题的人有所帮助。
    【解决方案3】:

    如果表单上不存在控件,Request.Form["ControlName"] 将返回 null

    如果 Control 存在,但它包含 null 或空值,则 Request.Form["ControlName"] 将始终返回 String.Empty

    所以最好不要比较(Request.Form["ControlName"] != null),而是使用(!String.IsNullOrEmpty(Request.Form["ControlName"]))

    【讨论】:

    • 嗨@NSNoob,如果控件不存在于表单中并附加到页面外部,为什么它返回null
    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2012-04-10
    相关资源
    最近更新 更多