覆盖 WebResource javascript 方法 - WebForm_InitCallback()

Override WebResource javascript method - WebForm_InitCallback()

本文关键字:InitCallback WebForm WebResource javascript 方法 覆盖      更新时间:2023-09-26

我被回调和多选选择控件困住了 ASP.NET。正如我注意到的,Microsoft自 2006 年以来就有一个错误(!),当我对选择 1,2,3 的多选执行回调时,回发数据为 1,1,1。我已经确定了问题,它采用以下方法:

function WebForm_InitCallback() {
    var formElements = theForm.elements,
        count = formElements.length,
        element;
    for (var i = 0; i < count; i++) {
            element = formElements[i];
            var tagName = element.tagName.toLowerCase();
            if (tagName == "input") {
                var type = element.type;
                if ((__callbackTextTypes.test(type) || ((type == "checkbox" || type == "radio") && element.checked))
                && (element.id != "__EVENTVALIDATION")) {
                    WebForm_InitCallbackAddField(element.name, element.value);
                }
            }
        else if (tagName == "select") {
            var selectCount = element.options.length;
                for (var j = 0; j < selectCount; j++) {
                var selectChild = element.options[j];
                if (selectChild.selected == true) {
                    WebForm_InitCallbackAddField(element.name, element.value);
                }
            }
        }
        else if (tagName == "textarea") {
            WebForm_InitCallbackAddField(element.name, element.value);
        }
    }
}

element.value不会传递正确的值,而是selectedChild.value在"选择"标记中。

即使我发现了问题,并且知道如何覆盖此方法,我也不相信这会起作用。覆盖来自资源的 JavaScript 方法是否正确?你建议我这样做吗?

谢谢。

该代码被Microsoft视为遗留代码,除非他们认为这是一个关键问题,否则不会修复。

他们的解决方法是实现一个自定义 http 模块,以便在将代码发送到浏览器之前对其进行更正。

  1. 创建自定义 http 模块
  2. 实现发布请求状态事件
  3. 将以下代码放在那里:

    void context_ReleaseRequestState(object sender, EventArgs e)
    {
        HttpApplication application = sender as HttpApplication;
        if (application != null)
        {
            if (application.Request.Url.ToString().Contains("WebResource.axd"))
            {
                #region Set private value of HttpWriter so we can write to output stream
                //See http://daniel-richardson.blogspot.com/2008/11/how-to-apply-filter-to-content-returned.html
                var response = application.Context.Response;
                var httpWriterField = typeof(HttpResponse).GetField("_httpWriter",
                                     BindingFlags.NonPublic | BindingFlags.Instance);
                var ignoringFurtherWritesField = typeof(HttpWriter).GetField("_ignoringFurtherWrites",
                                                 BindingFlags.NonPublic | BindingFlags.Instance);
                var httpWriter = httpWriterField.GetValue(response);
                ignoringFurtherWritesField.SetValue(httpWriter, false);
                #endregion
                //We need to read filter property first or we get exception
                var f = application.Response.Filter;
                application.Response.Filter = new ResponseFilter(application.Response.OutputStream);
            }
        }
    }
    
  4. 创建从 Stream 类继承的类响应过滤器。

构造 函数:

public ResponseFilter(Stream responseStream)
    {
        ResponseStream = responseStream;
    }

写入方法:

    public override void Write(byte[] buffer, int offset, int count)
    {
        string output = Encoding.UTF8.GetString(buffer, offset, count);
        string fixedOutput = output.Replace(@"if (selectChild.selected == true) {
                WebForm_InitCallbackAddField(element.name, element.value);", "if (selectChild.selected == true) {WebForm_InitCallbackAddField(element.name, selectChild.value);");
        byte[] fixedBuffer = Encoding.UTF8.GetBytes(fixedOutput);

        ResponseStream.Write(fixedBuffer, 0, fixedBuffer.Length);
    }

- 当实现其他减法方法时,只需简单地调用ResponseStream的方法