2009-04-14 34 views
4

我创建了一些Web用户控件(.ascx文件)并将它们放入页面中。用户控件中有一些文本框,我希望页面能够直接访问。ASP.NET:公开Web用户控件的控件

将用户控件中的这些TextBox暴露给包含用户控件的页面的最简单方法是什么(阅读:最少时间)?

我知道的两个选项是从页面调用myUserControl.FindControl(id)(这是否甚至可以在页面中工作?),并在用户控件中编写属性以公开TextBox值。

看起来不理想。 FindControl()要求页面知道用户控件中文本框的ID,从而打破封装并添加硬编码的字符串,并且在用户控件中编写一堆属性将非常耗时,因为这些用户中的文本框的数量控制。

没有办法将我的用户控件中的这些文本框声明为public而不是受保护

回答

4

(撇开这一事实,什么你描述本质上是最好的做法相反......显而易见评论)

如果您正在使用Web应用程序类型的项目,你应该有一个设计师。每个UserControl的cs文件。这包含每个子控件的声明,因此您可以将访问修饰符更改为public。

如果您使用的是网站类型项目,则应该转换为Web应用程序。 According to Microsoft(并由经验支持),当您计划编写跨越单一代码隐藏的大量代码时,不会使用网站类型。

0

为什么不给你的用户控件一个TextBoxes集合,将集合公开为一个属性,并且在Init()方法中,只需将所有文本框添加到集合中?

这样,您就拥有了一个集合,您可以根据ID进行搜索,而无需依赖任何页面逻辑,而只需公开一个属性。如果你为它创建自己的集合类,你甚至可以用一些方便的方法编程,以便按照需要访问文本框。

2

如果我必须这样做,我会写一个暴露控件的公共属性。但是,通常有一种方法可以重写信息,从而不需要公开内部控制。如果您只需要该值,请创建一个返回值的属性。如果您需要客户端ID,可能创建一个公开值或事件的客户端对象将解决问题。请记住,一旦你公开,你就会暴露合同,改变合同几乎总是很痛苦。

0

从公共基类中派生所有Web用户控件,并将此功能公开为公共方法(或方法)。你的基类可以派生自UserControl(通常是.ascx的方式),而你的控件又可以从它派生出来。

然后,即使使用反射似乎有点工作,你只做了一次。如果文本框是动态的,并且你想避免硬编码的话,这就是要走的路。

所以,如果你只是需要通过ID从母体获取文本框的值,你可以添加类似下面给你的基类:

public string GetTextboxValue(string id) 
    { 
     string textValue = string.Empty; 
     Control ctl = FindControl(id); 
     if (ctl.GetType() == typeof(TextBox)) 
      textValue = ((TextBox)ctl).Text; 
     return textValue; 
    } 

我说走这路由与以前的建议使TextBox公开,因为你真的只想从父文本中读取文本值而不是将整个对象公开为读/写。

1

您可以将其作为背后代码的属性公开。你真的只能从代码访问它的属性,而不是来自ASP.Net设计器。这是vb中的一个例子,它暴露了用户控件上的DropDownList(并且,它可能不是最佳实践,但它肯定会跳过编写代码以暴露子控件上的每个属性):

''' <summary> 
''' This is the exposed DropDownList for this control. 
''' </summary> 
''' <value></value> 
''' <returns></returns> 
''' <remarks></remarks> 
Public ReadOnly Property DrowDownList() As DropDownList 
    Get 
     Return ddControlList 
    End Get 
End Property