WebForms在自动反馈期间不包括表单中的电子邮件输入类型



我在一个页面上有一个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框架的相应更新后才会这样做:

<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(&quot;ctl00$MainContent$bbOK&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" >

当我们提交表单时,出现了电子邮件地址表单输入:

  • &ctl00%24MainContent%24edEmail = asdf%40here.net
  • &ctl00%24MainContent%24bbOK = Save+User

很好,浏览器(包括IE11和Chrome 30)都按预期提交了表单的内容。

接下来,我们在页面中添加一些东西来触发"自动回发",以及<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(&quot;ctl00$MainContent$bbOK&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" >

但是当这个表单"auto-postsback"时,email字段丢失了:

  • &ctl00%24MainContent%24rbAccountType = Local&__ASYNCPOST=true&

如果我将email输入的typeemail更改为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 h1> ebForms 是一个有bug的架构,我五年前就应该停止使用它了。它没有修复,微软也不会,所以我只是在寻求同情。不支持HTML 5。

WebForms使用浏览器不提交表单中的所有字段是什么?在IE和Chrome客户端中出现。

<标题>附录

这个问题的标题调用了email输入类型。但同样的错误发生在number输入类型;以及所有html5的输入类型

并在代码中标记超文本:

protected void Page_Load(object sender, EventArgs e)
{
   edEmail.Attributes["type"] = "email";
   edEmployeeID.Attributes["type"] = "number";
   ...
}

不能解决这个问题。在"auto-postback"提交期间,表单仍然无法提交其包含的值(并在"常规"提交期间正确提交所有值)。

令人印象深刻的是,在提出问题27分钟后,谷歌搜索:

asp.net autopostback不包含html5输入类型

只把我当作遇到问题的人。显然,我是唯一一个试图将HTML5硬塞进WebForms的人。

发现生成的WebForms客户端Javascript代码中的错误:

ScriptResource.axd

// Name:        MicrosoftAjaxWebForms.debug.js
// Assembly:    AjaxControlToolkit
// Version:     3.5.50401.0
// FileVersion: 3.5.50401
// (c) 2010 CodePlex Foundation
_onFormSubmit: function PageRequestManager$_onFormSubmit(evt)
{
   var count = form.elements.length;
   for (i = 0; i < count; i++) 
   {
       var element = form.elements[i];
       var tagName = element.tagName.toUpperCase();
       if (tagName === 'INPUT') 
       {
          var type = element.type;
          if ((type === 'text') ||
                (type === 'password') ||
                (type === 'hidden') ||
                (((type === 'checkbox') || (type === 'radio')) && element.checked)) 
          {
             formBody.append(encodeURIComponent(name));
             formBody.append('=');
             formBody.append(encodeURIComponent(element.value));
             formBody.append('&');
          }
       }
   }
}

根据定义,WebForms在回发期间不会在表单主体中输入HTML5输入类型。根据定义,它将只支持几种原始输入类型:

  • text
  • password
  • hidden
  • checkbox
  • radio
  • color 不支持
  • date 不支持
  • datetime 不支持
  • datetime-local 不支持
  • email 不支持
  • month 不支持
  • number 不支持
  • range 不支持
  • search 不支持
  • tel 不支持
  • time 不支持
  • url 不支持
  • week 不支持

您应该需要将服务器控件保留为<asp:TextBox ... />,但在代码中覆盖其type属性:

edEmail.Attributes["type"] = "email";

<子>[源]

最新更新