好的,场景如下:
我们将一个遗留的 Web 项目从 .Net 1.1 移植到 .Net 3.5,大多数事情都按照预期的方式工作。
但我们有一个奇怪的情况,即使在 .Net 2.0 中用于在 Web 控件中呈现名称的 id分隔符从 asp.net 更改为"$",我们的本地开发机器仍然使用 ":" 作为名称的 id分隔符来渲染 Asp.Net 控件。
但是,当我们将 Web 项目部署到我们的一个测试服务器时,这些相同的 asp.net 控件使用"$"作为名称的标识分隔符来呈现。
所以
问题1:为什么它只在我们的测试服务器中而不是在我们的本地计算机上以这种方式运行?
问题2:即使我们设法"修复"我们的本地开发机器以呈现正确的默认字符分隔符("$"),它也会破坏一些遗留的 js 代码,该代码假设 asp.net 控件使用":"分隔符呈现名称。我们可以在测试服务器中将默认字符分隔符改回冒号(":")吗?
快速查看如何使用 .NET Reflector 生成 UniqueID 显示,您可以通过在 Web.Configuration 中使用 <xhtmlConformance mode="Legacy" />
来获取":"而不是"$"。
但是,它可能会引入另一个问题。
详:
有一个受保护的属性Control.IdSeparator
在 UniqueId 生成期间用于获取分隔符:
protected char IdSeparator
{
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
get
{
if (this.Page != null)
{
return this.Page.IdSeparator;
}
return this.IdSeparatorFromConfig;
}
}
IdSeparatorFromConfig
在哪里
internal char IdSeparatorFromConfig
{
get
{
if (!this.EnableLegacyRendering)
{
return '$';
}
return ':';
}
}
EnableLegacyFromConfig
是
internal bool EnableLegacyRendering
{
get
{
System.Web.UI.Page page = this.Page;
if (page != null)
{
return (page.XhtmlConformanceMode == XhtmlConformanceMode.Legacy);
}
return ((!this.DesignMode && (this.Adapter == null)) && (this.GetXhtmlConformanceSection().Mode == XhtmlConformanceMode.Legacy));
}
}