为什么以下结果会产生一个真正的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");
}
%>
答案 0 :(得分:10)
首先,让我回答你的问题:
第一页加载是GET,回发是POST(因此名称 post 返回)。如果通过表单POST加载页面,则Request.Form
仅填充 。
在第一页加载时,Request.Form
是一个空集合。由于Request.Form
是NameValueCollection
,accessing a non-existent entry returns null。因此,Request.Form["whatever"]
会在首页加载时返回null
。
回发后,Request.Form
充满了值。由于HTTP POST不知道null
值,Request.Form["whatever"]
会返回一个空字符串,表示存在但为空的字段。
如果您想避开x != null && x != ""
模式,请使用String.IsNullOrEmpty或null 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
。
答案 1 :(得分:2)
Request.Form
是NameValueCollection,如果找不到指定的null
则返回key
,否则返回值(这是一个空字符串)。
您可以使用string.IsNullOrEmpty()
方法。
if (!string.IsNullOrEmpty(Request.Form["name"]))
{
Response.Write("<br/>");
Response.Write("Name OK");
}
答案 2 :(得分:2)
Request.Form["ControlName"]
会返回null
。
如果控件存在但包含null
或空值,则Request.Form["ControlName"]
将始终返回String.Empty
。
这是一个好习惯,而不是比较(Request.Form["ControlName"] != null)
,请使用(!String.IsNullOrEmpty(Request.Form["ControlName"]))