AnywherePlaceHolder 第 1部分:简单 AnywherePlaceHolder

分享于 

12分钟阅读

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函数紧密耦合。

在第一篇文章中,我将介绍 BaseAnywherePlaceHolderSimpleAnywherePlaceHolderSimpleAnywherePlaceHolder 仅用于解释真正的AnywherePlaceHolder的基础,在部分中将解释这一点。SimpleAnywherePlaceHolder 可以编写正常的控件,如 Label s。Table s。GridView s。

部分我将解释支持你编写任何内容( 包括提交按钮) 到任何其他框架( 关于它的功能)的工作的工作。 即使是JavaScript代码仍然可以工作。

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

使用代码

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

The class diagram

BaseAnywherePlaceHolder 是一个从 System.Web.UI.WebControls.Panel 继承而不是从继承的抽象类 System.Web.UI.WebControls.PlaceHolder 它的名字是什么。 PlaceHolder 不呈现自身,但只显示其子控件,我们需要控件来呈现自身。 然而 PlaceHolder的名字更直观地告诉了我们控件是什么。 下面是该控件的基本方法和属性:

  • DestinationControlId

    获取或者设置子控件应插入的元素的ID。 当指定这里属性时,子元素将通过 JavaScript innerHTML 函数插入到父框架中。 否则,通常会呈现子控件。

  • DestinationFrame

    获取或者设置子控件应插入的框架的名称。

  • SourceControl

    获取或者设置在客户端执行过程中无法找到时插入子控件中的控件的控件。 默认值是当前对象( 因此 这个 返回指针)。

  • SourceFrame

    获取或者设置对当前aspx页呈现这里控件的框架的客户端引用。 子控件需要引用时需要,当子控件使用JavaScript或者提交表单时,需要使用 换句话说,。

  • JavaScriptCode

    应该在客户端上注册的JavaScript代码。 这里代码将子控件插入到另一个框架中。 后代可以重写这里属性以实现不同的JavaScript函数。 然后应该重写 ScriptName 以返回不同的名称。

  • ScriptName

    应在客户端上呈现的JavaScript函数。 这里脚本的名称由 JavaScriptCode 属性定义。

  • RenderMethod

    可以设置渲染方法的枚举。 三个选项:

  • RenderNormal: 像普通 PlaceHolder 一样呈现子控件。
  • RenderInDestination: 在指定的目标元素中呈现子控件。
  • RenderBoth: 在目标中呈现,但在源中显示子级。

默认值为 RenderInDestination

  • CreateScriptCall

    使用HTML字符串作为输入和所有列出的其他属性,创建并返回调用 JavaScriptCodeScriptName 中定义的JavaScript函数的一些JavaScript代码。

  • PreRenderCheck

    检查是否正确设置了所有属性,并引发异常。 这里方法应从 Render 方法中调用,当该方法被子代重写时。

  • OnPreRender

    这里方法将 Control.OnPreRender 函数注册到页中。 Page.ClientScript.RegisterClientScriptBlock 鏂规碜。

SimpleAnywherePlaceHolder 控件继承自 BaseAnywherePlaceHolder,并且仅实现 Render 方法。 大部分工作都是由它的基类完成的。 Render 方法如下所示:

///<summary>Overridden.</summary>///<paramname="writer">The <seecref="System.Web.UI.HtmlTextWriter"/> object</param>protectedoverridevoid Render(System.Web.UI.HtmlTextWriter writer)
{
 // Checks if Properties are set correctly.this.PreRenderCheck();
 // Render the controlbase.Render(writer);
 // Check if the RenderMethod is RenderNormal. If so, than we're done.if (this.RenderMethod == AnywhereRenderMethodType.RenderNormal) return;
 // Create a HtmlTextWriter to buffer the output HtmlTextWriter buffer = new HtmlTextWriter(
 new StringWriter(CultureInfo.InvariantCulture));
 // get the output of the ChildControls in the bufferbase.RenderChildren(buffer);
 // Put the buffered text into a stringstring renderedChildren = buffer.InnerWriter.ToString();
 // Write the call to the JavaScript function to the page.this.Page.ClientScript.RegisterStartupScript(
 this.GetType(),
 this.DestinationControlId,
 this.CreateScriptCall(renderedChildren),
 true );
}

Render 方法只调用 base.Render() 方法,以便正常呈现控件。 当你知道 AnywherePlaceHolder 应该将HTML代码注入另一个框架时,这看起来很奇怪。 不过,JavaScript函数使用样式表'display'属性隐藏或者显示HTML代码。 写这个HTML代码并不是很有用,当它被隐藏的时候。 然而,有时候,HTML代码是真正需要的。 这将在本文的第2部分中显示,当解释完整版本的AnywherePlaceHolder 时,。

调用 base.Render() 方法后,当 RenderMode 设置为 RenderNormal 时,该方法将返回。 否则,创建 HtmlTextWriter 对象以缓冲 RenderChildren 方法的输出。 这里代码将用于生成一些 JavaScript,将HTML注入到目标元素中。 代码可以如下所示:

AnywherePlaceHolderWriter(
 'Title', 'TitlePlaceHolder', parent, true,
 '<img src="myimage.gif" src=""/>Function page dynamic title');

可以看到,对 AnywherePlaceHolderWriter 函数的调用保存了一些原始的HTML代码,包装在一个JavaScript字符串中。 这里HTML代码已经由 base.RenderChildren(buffer); 行呈现。 下面给出了 AnywherePlaceHolderWriter的代码:

function AnywherePlaceHolderWriter(destid, sourceid, destframe, 
 hideSource, destHtml)
{
 var dest = document.all? destframe.document.all[destid] : 
 destframe.document.getElementById(destid);
 var source = document.all? document.all[sourceid] : 
 document.getElementById(sourceid);
 if (dest) {
 dest.innerHTML = destHtml;
 if (source && hideSource) 
 source.style.display = 'none';
 }
 else {
 if (!source) alert('Can not find ' + sourceid + '.');
 }
}

AnywherePlaceHolderWriter 代码非常简单。 destidsourceid 参数是表示HTML元素to的字符串,destframe 是另一个帧( 所以不是一个字符串)的引用。 destHtml 包含应该注入到目标元素中的HTML代码。 这是用下面的代码完成的: dest.innerHTML = destHtml;

使用 SimpleAnywherePlaceHolder

使用 SimpleAnywherePlaceHolder 相当简单,但是在设计过程中必须同时处理两个框架。 查看以下示例:

Destination.aspx
<html><body><divid="DestElement"/><iframename="sourceframe"src="source.aspx"/></body></html>
Source.aspx
<%@RegisterNamespace="DeKale.WebControls"TagPrefix="kale"%><html><body><formrunat="server"><kale:SimpleAnywherePlaceHolderrunat="server"ID="TitlePlaceHolder"DestinationControlId="DestElement"DestinationFrame="parent"SourceFrame="FunctionFrame"RenderMethod="RenderInDestination"><asp:imagerunat="server"src="images/myimage.gif"/> Function page dynamic title
 </kale:AnywherePlaceHolder></form></body></html>

可以看到,Source.aspx的HTML包含一个 SimpleAnywherePlaceHolder 控件,其中包含属性 DestinationControlIdDestinationFrame。 在这种情况下,可以使用浏览器的'parent'属性来访问 destination.aspx。 但是 destination.aspx 也可能不是框架集中的父框架,而是一个兄弟框架。 那么 DestinationFrame 属性应该是类似的: 'parent.destination。框架集随后必须使用 name 属性来定义目标。 换句话说,我们可以一直到达另一个框架。

把东西包起来

如你所见,通过 innerHTML 属性使用相当简单的HTML注入,我们可以将控件呈现到另一个框架中。 "但是这一切总是很好",你可能会问:? 当你使用 SimpleAnywherePlaceHolder 写按钮,链接或者包含JavaScript的东西时,这种方法将会破坏。 是否有解决这里问题的方法? 是,请注意中的AnywherePlaceHolder ( AnywherePlaceHolder )。 第 2部分:高级 AnywherePlaceHolder。 !

历史记录

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

PAR  ANY  
相关文章