把 Dottext 的代码升级到 .NET 2.0 上以后,在显示Entry的页面上一直有JavaScript的错误,是在做 Validator 时产生的。错误部分的JavaScript代码如下:
<script type="text/javascript">
<!--
var PostComment.ascx_RequiredFieldValidator1 = document.all ? document.all["PostComment.ascx_RequiredFieldValidator1"] : document.getElementById("PostComment.ascx_RequiredFieldValidator1");
PostComment.ascx_RequiredFieldValidator1.controltovalidate = "PostComment.ascx_tbTitle";
PostComment.ascx_RequiredFieldValidator1.errormessage = "请输入“标题”";
PostComment.ascx_RequiredFieldValidator1.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
PostComment.ascx_RequiredFieldValidator1.initialvalue = "";
var PostComment.ascx_RequiredFieldValidator2 = document.all ? document.all["PostComment.ascx_RequiredFieldValidator2"] : document.getElementById("PostComment.ascx_RequiredFieldValidator2");
PostComment.ascx_RequiredFieldValidator2.controltovalidate = "PostComment.ascx_tbName";
PostComment.ascx_RequiredFieldValidator2.errormessage = "请输入“署名”";
PostComment.ascx_RequiredFieldValidator2.isvalid = "False";
PostComment.ascx_RequiredFieldValidator2.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
PostComment.ascx_RequiredFieldValidator2.initialvalue = "";
var PostComment.ascx_validatorCheckCode = document.all ? document.all["PostComment.ascx_validatorCheckCode"] : document.getElementById("PostComment.ascx_validatorCheckCode");
PostComment.ascx_validatorCheckCode.controltovalidate = "PostComment.ascx_txtCheckCodeInput";
PostComment.ascx_validatorCheckCode.isvalid = "False";
PostComment.ascx_validatorCheckCode.evaluationfunction = "CustomValidatorEvaluateIsValid";
// -->
</script>
PostComment.ascx 是一个文件名,下划线后面的是 validator 组件的名字,.NET 2.0 将组件的名字按层次方式级连起来组成了实例最终的id,但是“.”又是不能做为id出现的,至使脚本运行错误。
曾一直认为是 .NET 2.0 Beta 的问题,可是到了 .NET 2.0 正式版推出,错误依旧。今天忽然想到问题所在,原来是 Dottext 原有在 .NET 1.1 中运行正常的 UrlReWriteHandlerFactory 和 DottextMasterPage 机制产生的问题。
UrlReWriteHandlerFactory 在使用 DottextMasterPage 时,给 DottextMasterPage 安排了一个以逗号“,”分隔的.ascx组件文件列表。这些.ascx组件文件在 DottextMasterPage 组合的时候要创建若干 Control 的实例,这些实例的 id 属性又被分配为组件文件名。这就是问题所在。
在 .NET 2.0 中,是以每个parent-child关系层次的实例的id属性串联在一起的,这就使实例的id不应包含“.” 等不能在 JavaScript 当然对象名的字符。于是将代码先做以应急的修改,以后再做更妥善的处理:
DottextMasterPage.InitializeBlogPage 中:
foreach (string control in controls)
{
Control c = LoadControl( string.Format( ControlLocation, skin, control ) );
c.ID = strControlId;
CenterBodyControl.Controls.Add( c );
}
改为:
foreach (string control in controls)
{
Control c = LoadControl( string.Format( ControlLocation, skin, control ) );
string strControlId = control;
strControlId = strControlId.Replace( '.', '_' );
c.ID = strControlId;
CenterBodyControl.Controls.Add( c );
}
编辑备注:{3E933EFE-8394-4a87-97F6-1F7BA3CAA3B3}
2005年11月23日 00:43 沙发
這兩天一直不太正常
今天打開BLOG時,發現新發的貼子上面會空出N長的老大一段空白 。。
汗 2X 能看看是什麽原因麽??