IIS 8.5/Windows 2012 R2 应用程序池 HTML 渲染中断 Javascript
IIS 8.5/Windows 2012 R2 Application Pool HTML Rendering Is Breaking Javascript
我们在 Windows 2012 R2/IIS 8.5 从 Windows 2003/IIS 6 升级了一个相当大的关键任务 Web 应用程序到 运行。
应用程序框架为 3.5,IIS 8.5 应用程序最初设置为 CLR 2.0,但在发现关键功能(哈希表排序)未按预期工作时更改为 4.0。
这解决了哈希表问题,但是现在看来 HTML 的呈现方式不同,这破坏了 javascript 功能和 css.
例如:
图像的左侧(clr2.0 应用程序池)显示了带有所需 'ctl00$' 前缀的正确呈现的控件,但是图像的右侧(clr4.0 应用程序池)显示了 HTML呈现不正确,这在整个页面中都会发生,从而破坏了我们所需的 Javascript 功能。
这是另一个例子:
MS 建议将整个应用程序升级到 4.0 Framework,但 JS 似乎仍然损坏,因为 HTML 仍然呈现相同。
下面是一小段代码,用于将客户端 Javascript 事件添加到 .cs 代码隐藏中的 asp.net Link 控件:
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
LinkButton lnk = e.Item.FindControl("btnlnk2") as LinkButton;
DataRowView row = e.Item.DataItem as DataRowView;
if (lnk != null && row!=null)
{
lnk.Text = row["Linktext"].ToString();
lnk.OnClientClick = "return SetStatus('" + cgridNumbered.ClientID + "_ctl" + "','" + row["Name"].ToString() + "')";
}
}
这是 aspx 页面中的实际 Javascript:
function SetStatus(ddTarget,strLnk) {
var ctrl = document.getElementById(ddTarget);
var str = strLnk;
var chkNameLast = "_ddlNextMaterialStatus";
var i = 3;
var tempchkobj = document.getElementById(ddTarget + "02" + chkNameLast);
var intIdx = -1;
var intMax = tempchkobj.options.length;
for (var intOpt = 0; intOpt < intMax; intOpt++) {
if (tempchkobj.options[intOpt].text == strLnk) {
intIdx = intOpt; // this is the index
intOpt = intMax; // escape the loop
}
}
//more code..
return false;
}
当运行在触发此事件时使用 4.0 CLR 连接应用程序时,ddTarget 的值为 "MainContentPlaceHolder_cgridNumbered_ctl"
但是HTML是这样渲染的():
<a onclick="return SetStatus('MainContentPlaceHolder_cgridNumbered_ctl','Confirmed');" id="MainContentPlaceHolder_DataList1_btnlnk2_0" href="javascript:__doPostBack('ctl00$MainContentPlaceHolder$DataList1$ctl00$btnlnk2','')">Confirm All</a>
似乎单引号被翻译成它的 HTML 等价物:
'
我们的 Javascript 中断了,因为它找不到这个 DOM 对象。
当我们将应用程序池 clr 切换到 2.0 时,HTML 正确呈现如下:
<a onclick="return SetStatus('ctl00_MainContentPlaceHolder_cgridNumbered_ctl','Confirmed');" id="ctl00_MainContentPlaceHolder_DataList1_ctl00_btnlnk2" href="javascript:__doPostBack('ctl00$MainContentPlaceHolder$DataList1$ctl00$btnlnk2','')">Confirm All</a>
我们的 Javascript 按预期工作。
预先感谢您对此提供的任何帮助,我们已经为此工作了一个月。
在 IIS 中打开页面和控件设置
已将设置更改为以下内容:
CSS 和 Javascript 正在工作并且 HTML 正在按预期呈现:
我们在 Windows 2012 R2/IIS 8.5 从 Windows 2003/IIS 6 升级了一个相当大的关键任务 Web 应用程序到 运行。
应用程序框架为 3.5,IIS 8.5 应用程序最初设置为 CLR 2.0,但在发现关键功能(哈希表排序)未按预期工作时更改为 4.0。
这解决了哈希表问题,但是现在看来 HTML 的呈现方式不同,这破坏了 javascript 功能和 css.
例如:
这是另一个例子:
下面是一小段代码,用于将客户端 Javascript 事件添加到 .cs 代码隐藏中的 asp.net Link 控件:
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
LinkButton lnk = e.Item.FindControl("btnlnk2") as LinkButton;
DataRowView row = e.Item.DataItem as DataRowView;
if (lnk != null && row!=null)
{
lnk.Text = row["Linktext"].ToString();
lnk.OnClientClick = "return SetStatus('" + cgridNumbered.ClientID + "_ctl" + "','" + row["Name"].ToString() + "')";
}
}
这是 aspx 页面中的实际 Javascript:
function SetStatus(ddTarget,strLnk) {
var ctrl = document.getElementById(ddTarget);
var str = strLnk;
var chkNameLast = "_ddlNextMaterialStatus";
var i = 3;
var tempchkobj = document.getElementById(ddTarget + "02" + chkNameLast);
var intIdx = -1;
var intMax = tempchkobj.options.length;
for (var intOpt = 0; intOpt < intMax; intOpt++) {
if (tempchkobj.options[intOpt].text == strLnk) {
intIdx = intOpt; // this is the index
intOpt = intMax; // escape the loop
}
}
//more code..
return false;
}
当运行在触发此事件时使用 4.0 CLR 连接应用程序时,ddTarget 的值为 "MainContentPlaceHolder_cgridNumbered_ctl"
但是HTML是这样渲染的():
<a onclick="return SetStatus('MainContentPlaceHolder_cgridNumbered_ctl','Confirmed');" id="MainContentPlaceHolder_DataList1_btnlnk2_0" href="javascript:__doPostBack('ctl00$MainContentPlaceHolder$DataList1$ctl00$btnlnk2','')">Confirm All</a>
似乎单引号被翻译成它的 HTML 等价物:
'
我们的 Javascript 中断了,因为它找不到这个 DOM 对象。
当我们将应用程序池 clr 切换到 2.0 时,HTML 正确呈现如下:
<a onclick="return SetStatus('ctl00_MainContentPlaceHolder_cgridNumbered_ctl','Confirmed');" id="ctl00_MainContentPlaceHolder_DataList1_ctl00_btnlnk2" href="javascript:__doPostBack('ctl00$MainContentPlaceHolder$DataList1$ctl00$btnlnk2','')">Confirm All</a>
我们的 Javascript 按预期工作。
预先感谢您对此提供的任何帮助,我们已经为此工作了一个月。
在 IIS 中打开页面和控件设置
已将设置更改为以下内容:
CSS 和 Javascript 正在工作并且 HTML 正在按预期呈现: