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(&#39;MainContentPlaceHolder_cgridNumbered_ctl&#39;,&#39;Confirmed&#39;);" id="MainContentPlaceHolder_DataList1_btnlnk2_0" href="javascript:__doPostBack(&#39;ctl00$MainContentPlaceHolder$DataList1$ctl00$btnlnk2&#39;,&#39;&#39;)">Confirm All</a> 

似乎单引号被翻译成它的 HTML 等价物:

&#39;

我们的 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 正在按预期呈现: