这让我发疯了。我正在尝试将一些遗留应用程序迁移到新服务器,并且我遇到了很多问题,document.all
遍及整个代码。
在你说之前,我知道。不要使用document.all
。它就在那里,我无能为力......这个特殊的问题在程序集中有JavaScript,我没有源代码,我没有重新开发的权限。
我的主要困惑是,当我在与迁移版本相同的浏览器中进行测试时,当前版本的应用程序正在运行。这是一个直接的复制和粘贴作业,在迁移过程中没有代码发生变化,但是当我在新服务器document.all(element)
上运行应用程序时,总是返回null。
IIS或更新的.NET框架是否以某种方式以不同方式处理客户端脚本?
我来自使用IIS 6在Windows Server 2005上托管的.NET 2.0,以及使用IIS 8在Windows Server 2012上托管的.NET 4.0。
我正在寻找任何想法,为什么在同一个浏览器中进行测试时这些行为会有所不同
更新:
document.all
定位的用户控件正在编码,这会破坏控件的ID,即'elementId'
输出'elementId'
程序集中的代码使用的是Attributes.Add,它包含单引号。我发现有一些消息来源暗示了一个新类,例如:
public class HtmlAttributeEncodingNot : System.Web.Util.HttpEncoder
{
protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output)
{
output.Write(value);
}
}
正在添加,这将允许在web.config中使用<httpRuntime encoderType="HtmlAttributeEncodingNot"/>
关闭编码,但我无法向此项目添加新类
答案 0 :(得分:1)
我将保留已接受的答案,但是如果其他人在将来遇到此问题,请添加此答案。
我的情况发生了变化,我能够为项目添加一个类。我的问题中的课程:
public class HtmlAttributeEncodingNot : System.Web.Util.HttpEncoder
{
protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output)
{
output.Write(value);
}
}
以及在web.config中使用类进行编码:
<httpRuntime encoderType="HtmlAttributeEncodingNot"/>
足以处理Attributes.Add
中编码为$#39;
的单引号
此外,使用旧JavaScript需要注意的是.net呈现控件的ClientID。使用上述代码的组合,以及<xhtmlConformance mode="Legacy"/>
和clientIDMode="AutoID"
,我能够将html渲染为相同的2.0等同于暂时解决我的问题。
答案 1 :(得分:0)
听起来你的项目正在结束它的生命,你只想为它注入新的生命。我认为document.all是从IE11开始的,不是吗 - 所以时钟正在滴答作响。
我建议写一些Javascript来迭代DOM并查找任何编码的ID - 然后将它们更改回.NET 2表单。在页面底部运行该JS(而不是onload),希望在你“更正”id之前没有任何东西会尝试访问document.all。