在运行时,为了更好的网络可用性,重复的Web controls

分享于 

6分钟阅读

Web开发

  繁體

Sample Image - mirror.jpg

介绍

对于网页应用用户来说,网页滚动是一种不幸的现实。 虽然这是"有用"用于查看文档,但当你被迫向下滚动以保存对表单的更改时,它可能会。 当你的工作涉及到每天 1,000次的时候,它真的是"真正真真的"烦人的事情。 在这之前,我的客户已经注意到了这个问题,并要求我放置 Cancel Cancel Cancel Cancel help help help help 等等 every page的top。

显然,你可以不费力地做这个。 只要复制页面顶部的控件,给它们新的ID,然后引用其他控件所使用的相同事件处理程序。

但我们是程序员对吧而且在遗传学上我们是重复的代码。 谁真正想把自己的控制叫做 btnSave1btnSave2? 完全 uncool。

必须有"更好的方法"。

更好的方法

如果你有一种方法可以复制一组控件,这样它就会在同一页面上出现多次? 在运行时,而不是在设计时完全执行复制?

输入。"。"。Mirror 控件。Mirror 控件是一个非常简单的自定义控件。

结果是,.NET 控件呈现模型可以用于多次生成控件的HTML。 包含自定义控件的任何 WebControl 都将具有 RenderControl() 方法,Page 使用方法生成控件的HTML。 你也可以用它。

使用镜像控件

其他 WebControl 一样,使用 Mirror 控件非常复杂。 它的工作原理是

<cc1:Mirrorid="Mirror1"ControlID="ButtonPanel1"runat="server"/>
  • 给你的控制一个 ID,像 Mirror1。 如果没有,Visual Studio 就不需要,会为你创建一个。
  • 指定要通过 ControlID 属性进行镜像的web服务的ID
  • 是的,就是这样。

在页面顶部,确保引用自定义控件程序集,类似于下面的内容:

<%@RegisterTagPrefix="cc1"Namespace="MirrorControl"Assembly="MirrorControl"%>

使用指导

很简单,控制函数的MirrorRender()

  • 使用 Page.FindControl() 方法查找已经在 ControlID 属性中标识的控件。
  • 强制标识的控件通过调用它的RenderControl() 方法来呈现自身。

真正的情报只是几行代码。 这是 Mirror 控件的"全部"类定义。 谁说定制控件必须是复杂的?

///<summary>/// Mirror control./// Duplicates the rendered HTML of another control on the page.///</summary>[ToolboxData("<{0}:Mirror runat="server"></{0}:Mirror>")]publicclass Mirror : WebControl
{
 // This will be automatically populated on each Page_Load// with the value of the Mirror control's ControlID attribute.publicstring ControlID = null;
 protectedoverridevoid Render (HtmlTextWriter writer)
 {
 // Ensure that the ControlID was defined// otherwise abort the renderif (ControlID == null)
 return;
 // Locate the control identified by ControlID Control c = Parent.FindControl (ControlID);
 // If the specified control was not found, abortif (c == null)
 return;
 // Call the control's Render function in order to// generate the Mirror control's HTML.// This, in a nutshell is the mirroring process. c.RenderControl (writer);
 }
}

警告和限制

  • 你指定的控件将被复制为在其他地方呈现的"精确"。 同样,"精确"。这包括 ID 属性之类的东西。 如果你有引用这些 ID 属性的JavaScript,你可能会遇到问题。
  • 避免镜像数据输入控件( 比如。 TextBoxListBoxCheckBoxDropDownList,。"。"。)。"。"。"。"。"。"。"。"。"。"。"。"。"。"。 在 postback 期间,ASP.NET postback 处理程序只注意第一个与 ID 匹配的控件,并从那里加载它的值。 因此,如果更改控件的lower-in-the-page实例的内容,它的值将在 postback 上丢失。
  • 如果在布局中使用绝对定位,请确保不在镜像控件上使用它们。 否则两组控件将在同一位置呈现,一个位于另一个位置。 [Special thanks to UnderWing for pointing this out ]

提示和技巧

  • Mirror 控件被设计为只复制一个 WebControl。 如果希望复制一组控件,可以使用几个 Mirror 控件,或者,如果它们相邻,只需在 Panel 中包装控件,然后引用 PanelID
  • 可以在同一页面上多次镜像同一控件,如果这样一个事物是有用的。
  • 避免镜像数据输入控件( 比如。 TextBoxListBoxCheckBoxDropDownList,。),如上所述。
  • 避免镜像控件的绝对定位。
  • 如果需要访问控件的两个实例,FindControl() 函数将只定位其中之一。 但是,你可能可以迭代 Page.Controls Collection 并找到。