解决 BLOG 在显示/回复贴子时的错误

翟二喜

把 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}

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

  1. 笨球 5

    這兩天一直不太正常

    今天打開BLOG時,發現新發的貼子上面會空出N長的老大一段空白 。。

    汗 2X 能看看是什麽原因麽??