覆盖 WebResource javascript 方法 - WebForm_InitCallback()
Override WebResource javascript method - WebForm_InitCallback()
我被回调和多选选择控件困住了 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 模块,以便在将代码发送到浏览器之前对其进行更正。
- 创建自定义 http 模块
- 实现发布请求状态事件
-
将以下代码放在那里:
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); } } }
- 创建从 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的方法
源
相关文章:
- 在回发之间未保留ASP.NET WebForm ListBox数据
- 防止在js中回发webform下拉列表
- 在window.onbeforeunload上调用WebForm
- 将三个.js示例的webgl_loader_obj_mtl.html集成到 WebForm ASP.NET(mtlLoa
- 我们如何在 Webform 中验证文本框输入
- 从 javascript 文件访问 Webform
- 在aspx webform中从Javascript调用C#函数,然后重新加载页面
- 加载时blockUI,加载ASP.NET WebForm默认页后取消阻止UI
- @section脚本和ASP.Net WebForm中使用的常用脚本标记之间的区别
- 如何通过ASP.NET WebForm上的jQuery$.get()方法访问URL
- jQueryMobile在ASP中的应用净WebForm
- 启用或禁用javascript for asp.net webform按钮的e.c preventdefault
- 如何将javascript函数值传递给webform中的标签
- Podio Javascript WebForm
- 使用PHP提交一个使用javaScript的Webform:submitForm()
- 动态创建ImageButton并将其onclick函数设置为ServerTransfer到另一个WebForm
- 带有AJAX提交生成错误的Webform
- 将QueryString中的参数传递给WebForm
- 需要一个优雅的解决方案,选择webform's dom元素与jquery
- 51度.mobi, Firefox和Javascript错误(ASP. js).净Webform)