Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net html5中输入类型不是文本的UpdatePanel_Asp.net_Html_Updatepanel_Scriptmanager - Fatal编程技术网

Asp.net html5中输入类型不是文本的UpdatePanel

Asp.net html5中输入类型不是文本的UpdatePanel,asp.net,html,updatepanel,scriptmanager,Asp.net,Html,Updatepanel,Scriptmanager,我正在开发一个使用ASP.NET呈现HTML5的开源项目。您可以在这里查看: 现在,我有一个问题,更新面板发回的输入值的类型不是'文本'。您可能知道,HTML5引入了几种输入类型,例如“number”、“tel”、“search”等。现在,如果我呈现这样的控件,在正常情况下一切都可以正常工作,但是如果我将它们放在UpdatePanel中,则不会发回任何值,并且会重置该值 下面是一小段产生相同错误的代码: <asp:UpdatePanel runat="server" ID="UP

我正在开发一个使用ASP.NET呈现HTML5的开源项目。您可以在这里查看:

现在,我有一个问题,更新面板发回的输入值的类型不是'文本'。您可能知道,HTML5引入了几种输入类型,例如“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>
我已经尝试过的是阅读UpdatePanel、ScriptManager和ScriptManagerProxy类代码,但没有找到任何结果

我想我可能需要创建自己的UpdatePanel和/或ScriptManager类以供使用


谁能帮我一下,告诉我去哪里查一下

有趣的是,ASP.NET 4.0 AJAX框架似乎确实知道HTML5输入类型(参见代码),但正如@TimSchmelter所指出的,这被微软确认为一个bug

这可能会为调试行为和/或重写默认行为并找到解决方案提供一个起点

这也可能是这些输入类型的服务器端处理代码出错,尽管我不确定他们为什么应该/会关心异步回发而不是正常回发

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, 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
this._textTypes=/^(文本|密码|隐藏|搜索|电话| url |电子邮件|号码|范围|颜色|日期|日期|月|周|时间|日期|本地)$/i;
函数Sys$WebForms$PageRequestManager$\u onFormSubmit(evt){
变量i,l,continuesSubmit=true,
isCrossPost=这个;
这是。_isCrossPost=false;
如果(本次提交){
continueSubmit=这个;
}
如果(继续提交){
对于(i=0,l=this.\u onSubmitStatements.length;i
好吧,我想出了一个办法来解决这个问题。 首先,我发现Tim Medora提供的代码存在问题。这都是
this.
modifier的错误。所以这个JavaScript修复了这个问题:

var _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) {
...
if (_textTypes.test(type) ||
       (((type === 'checkbox') || (type === 'radio')) && element.checked)) {
       formBody.append(encodeURIComponent(name));
       formBody.append('=');
       formBody.append(encodeURIComponent(element.value));
       formBody.append('&');
...
}
现在我必须将我的函数注入
ScriptResource.axd
。 现在我找到了一种似乎有效的方法:

我创建了一个类
ScriptResourceHandler
,它扩展了命名空间DotM.Html5.Handlers中的
System.Web.Handlers.ScriptResourceHandler

在它的
ProcessRequest
中,我调用了
base.ProcessRequest(context)
来完成它的工作。但是我想把我的函数添加到一个呈现原始函数的函数中。我发现是在传递加密的
ZSystem.Web.Extensions,4.0.0.0,31bf3856ad364e35 | MicrosoftAjaxWebForms.debug.js

另一个问题是,在
System.Web.Handlers.ScriptResourceHandler
中,调用内部的“Page.DecryptString”方法来解密查询字符串参数。 因此,我无法通过反射调用该方法

代码如下:

        protected sealed override void ProcessRequest(HttpContext context)
        {
            base.ProcessRequest(context);
            if (CypherContainsAjax(context.Request.QueryString["d"]))
                context.Response.Write(OnFormSubmit);
        }

        private bool CypherContainsAjax(string cypher)
        {
            var text = DecryptString(cypher);
            if (text == null)
                return true; //Then Add it everywhere. What else could I do? :D
            return text.Contains("MicrosoftAjaxWebForms");
        }

        private string DecryptString(string cypher)
        {
            if (PageDecryptString == null)
                return null;
            return (string)PageDecryptString.Invoke(null, new object[] { cypher });
        }
        private static MethodInfo PageDecryptString;
        static ScriptResourceHandler()
        {
            PageDecryptString = typeof(Page).GetMethod("DecryptString", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
        }

您可以称之为某种丑陋的黑客行为…

这在.Net 4可靠性更新1中已经修复(还有一个版本2,但它不包含第一个版本):

但如果您使用的是AjaxControlToolkit,它将使用自己的内部MicrosoftAjaxWebForms.js w
        protected sealed override void ProcessRequest(HttpContext context)
        {
            base.ProcessRequest(context);
            if (CypherContainsAjax(context.Request.QueryString["d"]))
                context.Response.Write(OnFormSubmit);
        }

        private bool CypherContainsAjax(string cypher)
        {
            var text = DecryptString(cypher);
            if (text == null)
                return true; //Then Add it everywhere. What else could I do? :D
            return text.Contains("MicrosoftAjaxWebForms");
        }

        private string DecryptString(string cypher)
        {
            if (PageDecryptString == null)
                return null;
            return (string)PageDecryptString.Invoke(null, new object[] { cypher });
        }
        private static MethodInfo PageDecryptString;
        static ScriptResourceHandler()
        {
            PageDecryptString = typeof(Page).GetMethod("DecryptString", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
        }
<asp:ScriptManager runat="server">
  <Scripts>
    <asp:ScriptReference Path="~/MicrosoftAjaxWebForms.js" />
  </Scripts>
</asp:ScriptManager>