我正在开发一个使用ASP.NET渲染
HTML5的开源项目.在这里你可以看看:
http://asphtml5.codeplex.com/
http://asphtml5.codeplex.com/
现在我在更新面板中出现了一个问题,用于发布具有“text”以外类型的输入值.你可能会知道,html 5已经引入了几个输入类型,例如’number’,’tel’,’search’等.现在如果我渲染这样的控件,一切都在正常情况下正常工作,但如果我把它们放在UpdatePanel,没有值将被发回,该值将被重置.
<asp:UpdatePanel runat="server" ID="UP"> <ContentTemplate> <p> Enter A Number: <asp:TextBox runat="server" ID="Number2" type="number" /> </p> <asp:Button Text="Submit" runat="server" ID="BtnSubmit" OnClick="BtnSubmit_Click" /> <p> You entered : <asp:Label Text="" ID="LblValue" runat="server" /> </p> </ContentTemplate> </asp:UpdatePanel>
如果您在支持html 5的浏览器上测试此代码,可以说Chrome作为示例,将显示“数字向上”字段.但是如果您单击提交按钮,它将丢失您输入的值.
这里是事件处理程序的代码:
protected void BtnSubmit_Click(object sender,EventArgs e) { LblValue.Text = Number2.Text; }
我已经尝试过的是读取UpdatePanel,ScriptManager和ScriptManagerProxy类代码,没有发现.
我想我可能需要创建我自己的UpdatePanel和/或ScriptManager类才能使用.
有人可以帮我,告诉我哪里检查.
解决方法
有趣的是,ASP.NET 4.0 AJAX框架似乎知道HTML 5输入类型(见代码),但是@TimSchmelter指出,这被Microsoft证实为一个错误.
这可能会为您提供调试行为和/或覆盖默认行为并找到解决方案的起点.
这也可能是这些输入类型的服务器端处理代码的错误,尽管我不知道为什么他们应该/会关心异步回发与正常的回发.
this._textTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i; function Sys$WebForms$PageRequestManager$_onFormSubmit(evt) { var i,l,continueSubmit = true,isCrossPost = this._isCrossPost; this._isCrossPost = false; if (this._onsubmit) { continueSubmit = this._onsubmit(); } if (continueSubmit) { for (i = 0,l = this._onSubmitStatements.length; i < l; i++) { if (!this._onSubmitStatements[i]()) { continueSubmit = false; break; } } } if (!continueSubmit) { if (evt) { evt.preventDefault(); } return; } var form = this._form; if (isCrossPost) { return; } if (this._activeDefaultButton && !this._activeDefaultButtonClicked) { this._onFormElementActive(this._activeDefaultButton,0); } if (!this._postBackSettings || !this._postBackSettings.async) { return; } var formBody = new Sys.StringBuilder(),count = form.elements.length,panelID = this._createPanelID(null,this._postBackSettings); formBody.append(panelID); for (i = 0; i < count; i++) { var element = form.elements[i]; var name = element.name; if (typeof(name) === "undefined" || (name === null) || (name.length === 0) || (name === this._scriptManagerID)) { continue; } var tagName = element.tagName.toUpperCase(); if (tagName === 'INPUT') { var type = element.type; if (this._textTypes.test(type) || ((type === 'checkBox' || type === 'radio') && element.checked)) { formBody.append(encodeURIComponent(name)); formBody.append('='); formBody.append(encodeURIComponent(element.value)); formBody.append('&'); } } else if (tagName === 'SELECT') { var optionCount = element.options.length; for (var j = 0; j < optionCount; j++) { var option = element.options[j]; if (option.selected) { formBody.append(encodeURIComponent(name)); formBody.append('='); formBody.append(encodeURIComponent(option.value)); formBody.append('&'); } } } else if (tagName === 'TEXTAREA') { formBody.append(encodeURIComponent(name)); formBody.append('='); formBody.append(encodeURIComponent(element.value)); formBody.append('&'); } } formBody.append("__ASYNCPOST=true&"); if (this._additionalInput) { formBody.append(this._additionalInput); this._additionalInput = null; } // truncated for length