AnywherePlaceHolder 第 3部分 AnywhereValidationSummaryPlaceHolder

分享于 

9分钟阅读

Web开发

  繁體

Example of html page with IFrame. the. aspx page in the IFrame writes controls in it's parent

介绍

在编写可以访问的网站时,我们被告知框架是错误的。 但是,对于你公司或者你的客户的本地内部网的web应用程序,框架可能非常有用。 但是为什么我们的ASP.NET 开发者很少使用框架来实现我们的web应用? 我们不喜欢框架,因为 ASP.NET 限制了我们当前构建的页面,不允许我们从'图文框'中访问,而不需要不断地刷新它们。

这篇文章是三部曲的第三部分,其中我介绍了 AnywherePlaceHolder。 一个类似普通 PlaceHolder ( 带子项)的控件,可以使你在web应用程序的任何框架中呈现子控件。 控件在新 ASP.NET 2.0中构建,使用泛型,并与 ASP.NET 2.0客户端JavaScript函数紧密耦合。

如果你没有阅读本文的第一或者第二部分,我建议你先阅读它们: AnywherePlaceHolder。第 1部分: 简单的AnywherePlaceHolder 和 第 2部分:高级 AnywherePlaceHolder。

中,本文的第一部分是介绍和 SimpleAnywherePlaceHolderSimpleAnywherePlaceHolder 仅用于解释在部分中解释的实际 AnywherePlaceHolder的基本内容。 SimpleAnywherePlaceHolder 可以编写正常的控件,如 Label s。Table s。GridView s。

在第2 部分,我解释了使你能够将任何内容( 包括提交按钮) 写到任何其他框架( 包括提交按钮)的工作。 即便是JavaScript代码仍然可以工作。

在本部分中,我将解释 AnywhereValidationSummaryPlaceHolder 它从 BaseAnywherePlaceHolder 继承,并且具有普通 ValidationSummary的功能。 这个特殊 PlaceHolder 允许你将自定义消息和验证错误消息写入到选择的框架中。

引用

iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 AnywhereValidationSummaryPlaceHolder 使用 JavaScriptBuilder 类,这是由保罗设计的。 请参见 JavaScriptBuilder: 用于自定义控件的JavaScript处理程序类,位于代码项目。

ASP.NET 2.0

这个项目是为 ASP.NET 2.0编写的,不会在. NET 1. x. 下编译,但我相信它可以将它的移回. NET 1. x,。

使用代码

在这一部分中,我们将检查 AnywhereValidationSummaryPlaceHolder 类。below 是类关系图:

The class diagram

iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 AnywhereValidationSummaryPlaceHolder 继承自 BaseAnywherePlaceHolder,但与 AnywherePlaceHolder ( 在第二部分) 相反,这个类实际上是 System.Web.UI.WebControls.ValidationSummary 以伪装的方式 AnywhereValidationSummaryPlaceHolder '的代码:

publicclass AnywhereValidationSummaryPlaceHolder : BaseAnywherePlaceHolder
{
 private ValidationSummary _validationSummary;
 ///<summary>Constructor</summary>public AnywhereValidationSummaryPlaceHolder()
 : base()
 {
 this._validationSummary = new ValidationSummary();
 this.SourceControl = this._validationSummary;
 // Adding the controls to the hierarchy.this.Controls.Add(this._validationSummary);
 }
 // Some code left out#region ValidationSummary memberspublicoverride Color BackColor
 {
 get { returnthis._validationSummary.BackColor; }
 set { this._validationSummary.BackColor = value; }
 }
 publicoverride BorderStyle BorderStyle
 {
 get { returnthis._validationSummary.BorderStyle; }
 set { this._validationSummary.BorderStyle = value; }
 }
 publicoverride Color BorderColor
 {
 get { returnthis._validationSummary.BorderColor; }
 set { this._validationSummary.BorderColor = value; }
 }
 // Some code left out#endregion//ValidationSummary members}

iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 AnywhereValidationSummaryPlaceHolder 实例化 private System.Web.UI.WebControls.ValidationSummary public WebControl 布局属性被重定向到内部 ValidationSummary。 可以在构造函数中看到,内部 ValidationSummary 被添加到 AnywhereValidationSummaryPlaceHolder 's 通过调用来控制层次结构 this.Controls.Add(this._validationSummary) ; 现在,ValidationSummary 是一个子控件,我们从本文前面的两部分中知道,现在可以在任何地方呈现摘要。

完成了不,不,不,不过,ValidationSummary 将显示在另一个框架中,我们缺少一个重要。 你可能知道,ValidationSummary 显示来自验证器控件的ErrorMessage。 不仅在 postback 显示之后,而且大多数时候没有 postback,通过 JavaScript。

所以我们必须要做的是伪装 ASP.NET 框架,以便它认为它改变旧的ValidationSummary。 below 是呈现在页面中的JavaScript代码:

// Fetch the placeholder from this framevar AnywhereValidationSummaryPlaceHolder = 
 document.all? document.all["AnywhereValidationSummaryPlaceHolder"] :
 document.getElementById("AnywhereValidationSummaryPlaceHolder");// Fetch the summary from this framevar ctl05 = document.all? document.all["ctl05"] : 
 document.getElementById("ctl05");// write the summary to the destination frameAnywhereSummaryWriter('Summary', 'AnywhereValidationSummaryPlaceHolder', 
 parent, true);// Fetch the destination placeholdervar dest_AnywhereValidationSummaryPlaceHolder = document.all? 
 parent.document.all["Summary"] : parent.document.getElementById("Summary");// Fetch the destination summaryvar dest_ctl05 = document.all? parent.document.all["ctl05"] : 
 parent.document.getElementById("ctl05");
dest_ctl05.displaymode = "List";// Change the reference to the summary in a reference to // the new summary in the destination frameif (dest_AnywhereValidationSummaryPlaceHolder!= null && 
 dest_ctl05!= null && typeof(Page_ValidationSummaries)!= "undefined")
{
 var counter;
 var error = true;
 for (counter = 0; counter <Page_ValidationSummaries.length; counter++)
 {
 if (Page_ValidationSummaries[counter] == ctl05)
 {
 Page_ValidationSummaries[counter] = dest_ctl05;
 error = false;
 }
 }
 if (error == true) alert('Element ctl05 could not be ' + 
 'found in jscript for AnywhereValidationSummary.');
}

JavaScript代码 上面 将 ValidationSummary 控件插入目标框架,获取引用并用 Page_ValidationSummaries array 中的新 ValidationSummary 替换对当前 ValidationSummary的引用。 这里 array 保存页面控件的ValidationSummary

结束语

在这三篇文章中我试着解释一下如何超越HTML框架的边界。 虽然我提供的方法远非完美,但在某些受控环境中效果很好。 但是当你在设计时没有什么线索的时候,你会发出什么类型的控制,然后它就会出错。 模型现在无法处理定制的JavaScript函数。 它只识别 ASP.NET 2.0框架中预定义的JavaScript函数。

开心编码!

历史记录

  • 22 2005年08月 - 版本 1.0. 初始版本。

PAR  ANY  
相关文章