ASP.Net 4中ClientIDMode的正确设置是什么,以获得ASP.Net 2.0渲染。

时间:2010-06-09 16:55:59

标签: asp.net asp.net-4.0 clientid

我们刚刚将我们的应用程序从ASP.Net 2.0更新到ASP.Net 4.0。

我们已在<system.web>元素中包含在web.config中:

<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />

我的理解是,这应该使控件与.Net 2.0 / 3.5相同。

然而......它不是......这是一个例子

这是在2.0中呈现的:

<input id="grdUserEntity__ctl1_chkSelectAll" type="checkbox"
   name="grdUserEntity:_ctl1:chkSelectAll" onclick="javascript:iSelectAll();" />

这是在4.0:

<input id="grdUserEntity_ctl01_chkSelectAll" type="checkbox" 
   name="grdUserEntity$ctl01$chkSelectAll" onclick="javascript:iSelectAll();" />

区别:

2.0 id=grdUserEntity__ctl1_chkSelectAll
4.0 id=grdUserEntity_ctl01_chkSelectAll

根据我读到的,配置设置将导致ASP.Net 4.0呈现服务器控件和客户端ID与先前版本相同。

我们做错了什么?

3 个答案:

答案 0 :(得分:12)

从ASP.NET 2.0到ASP.NET 3.5的ID呈现方式发生了变化。因为你从2.0到4.0,你仍然看到了这种差异。这一变化是由于XHTML合规性的改进。

您可以尝试使用xhtmlCompliance compat设置切换回2.0渲染。另一个compat设置,是:)它应该工作,但老实说,我不确定如何测试旧的compat设置是在4.0,我知道它将与UpdatePanel不兼容,如果你打算使用这一点。

您是否有理由保留2.0渲染?只是担心回归,或者你有任何已知的实际回归?

XHTML设置:http://msdn.microsoft.com/en-us/library/ms178159.aspx

答案 1 :(得分:1)

对于本文的未来读者,您可以在ASP.NET页面中使用<%=objectid.ClientId %>构造来缓解兼容性问题。

示例:假设您需要在某些客户端javascript代码中引用的文本框名为txtInput(ASP.NET呈现为id = ctl00_cphMainContent_txtInput)。您可以在ASP.NET页面中使用以下javascript代码引用该对象:

str txtInputObjNm = "<%=txtInput.ClientId %>";

在运行时,它将自动转换为以下客户端javascript:

str txtInputObjNm = "ctl00_cphMainContent_txtInput";

如果.NET“决定”改变分配clientid的方式,那么您的代码仍然有效。

答案 2 :(得分:1)

在4.0应用程序中,pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"将完全破坏Site.master页面中的样式。例如,菜单在设计器中几乎不可见,并且将在浏览器中完全失去其样式。基本上,设计师将失去造型。

我通过将目标框架从4.0设置为3.5并返回到4.0来找到了这一点。在此之后,造型令人费解。在将所有文件与一个好的应用程序进行比较后,我终于在web.config中找到了这一行。我删除它,我的造型问题消失了。