我有一个asp:TextBox
在页面上:
<asp:TextBox ID="edEmail" runat="server" />
并且表单是正常提交的<asp:Button>
控制:
<asp:TextBox ID="edEmail" runat="server" />
<asp:Button ID="bbOK" Text="Save User" runat="server" OnClick="bbOK_Click" />
这些在客户端中呈现为:
<input name="ctl00$MainContent$edEmail" id="ctl00_MainContent_edEmail"></input>
<input name="ctl00$MainContent$bbOK" id="ctl00_MainContent_bbOK"
type="submit" value="Save User"
onclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$bbOK", "", true, "", "", false, false))' >
当表格通过常规方式提交时<asp:Button>
一切都正确发送。读取 html 表单很痛苦,但格式化的请求正文是:
&ctl00%24MainContent%24edEmail = asdf%40here.net
&ctl00%24MainContent%24bbOK = Save+User
太好了,电子邮件地址将发送至服务器。接下来我们将更改type
将输入框改为新的html5
email类型。我们在安装 .NET 4 Framework 的适当更新后执行此操作:
<asp:TextBox ID="edEmail" type="email" runat="server" />
<asp:Button ID="bbOK" Text="Save User" runat="server" OnClick="bbOK_Click" />
现在我们重复相同的过程。渲染后的 HTML 为:
<input type="email" name="ctl00$MainContent$edEmail" id="ctl00_MainContent_edEmail" >
<input name="ctl00$MainContent$bbOK" id="ctl00_MainContent_bbOK"
type="submit" value="Save User"
onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$bbOK", "", true, "", "", false, false))" >
当我们提交表单时,会出现电子邮件地址表单输入:
&ctl00%24MainContent%24edEmail = asdf%40here.net
&ctl00%24MainContent%24bbOK = Save+User
太好了,浏览器(IE11 和 Chrome 30 左右)正在按预期提交表单内容。
接下来我们向页面添加一些内容来触发“自动回发”, an <asp:RadioGroup>
:
<asp:TextBox ID="edEmail" type="email" runat="server" />
<asp:RadioButtonList ID="rbAccountType" runat="server" AutoPostBack="true" OnSelectedIndexChanged="rbAccountType_IndexChanged">
<asp:ListItem>Windows</asp:ListItem>
<asp:ListItem Selected="True">Local</asp:ListItem>
</asp:RadioButtonList>
<asp:Button ID="bbOK" Text="Save User" runat="server" OnClick="bbOK_Click" />
这给出了渲染的 HTML:
<input type="email" name="ctl00$MainContent$edEmail" id="ctl00_MainContent_edEmail" >
<input id="ctl00_MainContent_rbAccountType_0" type="radio" name="ctl00$MainContent$rbAccountType" value="Windows" checked="checked"><label for="ctl00_MainContent_rbAccountType_0">Windows</label>
<input id="ctl00_MainContent_rbAccountType_1" type="radio" name="ctl00$MainContent$rbAccountType" value="Local"
onclick="javascript:setTimeout('__doPostBack(\'ctl00$MainContent$rbAccountType$1\',\'\')', 0)">
<input name="ctl00$MainContent$bbOK" id="ctl00_MainContent_bbOK"
type="submit" value="Save User"
onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$bbOK", "", true, "", "", false, false))" >
但是当这个表格“自动回发”, the email字段缺失:
&ctl00%24MainContent%24rbAccountType = Local&__ASYNCPOST=true&
如果我改变email输入的type
from email
to text
:
<asp:TextBox ID="edEmail" runat="server" Type="text" />
渲染的单选按钮不受影响:
<input id="ctl00_MainContent_rbAccountType_1" type="radio" name="ctl00$MainContent$rbAccountType" value="Local"
onclick="javascript:setTimeout('__doPostBack(\'ctl00$MainContent$rbAccountType$1\',\'\')', 0)">
但回发数据现在(正确地)包含了它应该包含的内容:
&ctl00%24MainContent%24edUsername = ian
&ctl00%24MainContent%24edFullname = Ian%20Boyd
&ctl00%24MainContent%24edDescription = foo
&ctl00%24MainContent%24edEmail = asdf%40here.net
&ctl00%24MainContent%24rbAccountType = Local&__ASYNCPOST=true&
如果我把它改回email
:
<asp:TextBox ID="edEmail" runat="server" Type="email" />
它再次失败,未能包含email
输入类型
&ctl00%24MainContent%24edUsername = ian
&ctl00%24MainContent%24edFullname = Ian%20Boyd
&ctl00%24MainContent%24edDescription = foo
&ctl00%24MainContent%24rbAccountType = Local&__ASYNCPOST=true&
tldr
WebForms 是一个有缺陷的架构,我五年前就应该停止使用它。没有解决办法,微软也不会,所以我只是寻求同情。 不支持 HTML 5。
使用 WebForms 做什么browser不提交表单中的所有字段?故障发生在IE和Chrome客户端。
Addendum
这个问题的标题呼唤着email
输入类型。但同样的错误发生在number
输入类型;大概是所有 html5 输入类型。
并在代码中标记超文本:
protected void Page_Load(object sender, EventArgs e)
{
edEmail.Attributes["type"] = "email";
edEmployeeID.Attributes["type"] = "number";
...
}
并没有解决它。表单在执行期间仍然无法提交其包含的值“自动回发”提交(并在“常规”提交期间正确提交所有值)。
令人印象深刻的是,在提出问题 27 分钟后,谷歌搜索到了:
asp.net autopostback不包括html5输入类型
只给我作为遇到问题的人。显然我是唯一一个尝试将 HTML5 硬塞到 WebForms 中的人。