AnywherePlaceHolder 第 2部分:高级 AnywherePlaceHolder

分享于 

8分钟阅读

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。

中,本文的第一部分介绍了以及 SimpleAnywherePlaceHolderSimpleAnywherePlaceHolder 仅用于解释现在将在第1部分中解释的实际 AnywherePlaceHolder的基础。 SimpleAnywherePlaceHolder 可以编写正常的控件,如 Label s。Table s。GridView s。

在这部分中,我将解释 AnywherePlaceHolder的工作,它可以基本上编写任何内容,包括提交按钮。 即使是JavaScript代码仍然可以工作。

第三部分中,我将解释AnywhereValidationSummaryPlaceHolder 这是一个 AnywherePlaceHolder,它具有普通 ValidationSummary的功能。 这是一个 BaseAnywherePlaceHolder,它具有普通 ValidationSummary的功能。 这个特殊 PlaceHolder 允许你将自定义消息和验证错误消息写入到选择的框架中。

ASP.NET 2.0

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

使用代码

在本部分中,我们将检查 AnywherePlaceHolder 类。 below 是类关系图。

The class diagram

AnywherePlaceHolder 解决了JavaScript和提交按钮的问题,即 SimpleAnywherePlaceHolder 已经。 首先,AnywherePlaceHolder 搜索自己的控件层次结构以查找启用它的UseSubmitBehaviour 属性的Button 控件。 提交代码时提交按钮是真正讨厌的动物。 在逻辑上,由于 Button的提交行为没有任何作用,没有 Form 元素。 所以我们要做的是设置所有 ButtonUseSubmitBehaviourfalse 在我们缓冲子控件的html代码之前。

提交也有一个非常重要的特征。 当页上的输入控件中按下回车键时,Form 可以强制提交。 这允许用户在没有鼠标的情况下使用页面。 所以当我们从源代码中移除 Button的时候这个特性将会消失。 迭代所有子控件都是用 ControlTree 类完成的。 解释这个类超出了本文的范围。 下载源代码并查看它的实现方式。

解决这个问题的方法相当简单。 使用启用的"提交"行为在源框架中呈现 Button 控件,但使用样式表'display'属性隐藏它们。 记住第一个部分的source.style.display ='none'; 行?

现在我们修复了提交按钮的问题,但是仍然没有按钮可以工作,因为每个 ASP.NET Button 默认都使用 JavaScript。 按钮在目标框架中呈现,但必须调用源框架中的JavaScript函数。 为此,我们需要 BaseAnywherePlaceHolder 类中的SourceFrame 属性。 ConvertSourceCodeAnywherePlaceHolder 方法实现了。 这个方法只是从 ASP.NET 2.0框架中搜索预定义的JavaScript函数,并在它之前添加 sourceframe。 下面说明了 ConvertSourceCode 方法:。

protectedstaticreadonly string[] AspNetJavaScriptFunctions = new string[] {
 "WebForm_CallbackComplete", "WebForm_DoCallback", "WebForm_DoPostBackWithOptions", "WebForm_EncodeCallback", "WebForm_FireDefaultButton", "WebForm_GetScrollX", "WebForm_GetScrollY", "WebForm_InitCallback", "WebForm_PostBackOptions", "WebForm_ReDisableControls", "WebForm_ReEnableControls", "WebForm_RestoreScrollPosition", "WebForm_SaveScrollPositionOnSubmit", "WebForm_SaveScrollPositionSubmit", "WebForm_TextBoxKeyHandler", "__doPostBack"};protectedstring ConvertSourceCode(string sourceHtmlCode)
{
 StringBuilder destinationHtmlCode = new StringBuilder(sourceHtmlCode);
 // Searching for internal ASP.NET javascript functions and add // 'SourceFrame.' to the function call.for (int j = 0; j < AspNetJavaScriptFunctions.Length; j++)
 {
 destinationHtmlCode.Replace(AspNetJavaScriptFunctions[j], 
 this.SourceFrame + "." + AspNetJavaScriptFunctions[j]);
 }
 // Replacing all 'this.document.' references to the 'SourceFrame.' destinationHtmlCode.Replace("this.document.", this.SourceFrame + ".");
 return destinationHtmlCode.ToString();
}

可以看到,该方法遍历 AspNetJavaScriptFunctions array 并搜索十六个已经定义的JavaScript函数。 然后它会搜索 this.document。 你现在唯一的问题就是调用你自己的JavaScript函数。 当前的实现没有解决方案,但是很容易创建一些简单的技巧。

把东西包起来

你已经看到,使用最小编码,可以创建 AnywherePlaceHolder,它可以将几乎每个控件从一帧投射到另一个帧。 Image s,Button s,甚至完整 Table s 可以在框架之间轻松传输。 但正如你已经知道的,本文还有另一部分,所以这个概念仍然缺少。 丢失是将 ValidationSummary 组件放入另一个框架的可能性。 iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 AnywhereValidationSummaryPlaceHolder 将在中处理 AnywherePlaceHolder。 第 3部分:AnywhereValidationSummaryPlaceHolder !

历史记录

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

PAR  ANY  
相关文章