ASP.NET:公开Web用户控件的控件

4
我创建了一些Web User Controls (.ascx文件),并将它们放入到页面中。这些用户控件中有一些文本框,我希望页面能够直接访问这些文本框。
那么,最简单(也就是最省时)的方法是什么呢?有两种选择可供考虑:一种是从页面中调用 myUserControl.FindControl(id)(不知道这个会不会在页面中起作用),另一种是编写用户控件中的属性来公开文本框的值。
但这两种方法都不是很理想。FindControl()需要页面知道用户控件中文本框的ID,这样就破坏了封装性,并且添加硬编码字符串。而编写一堆属性来公开用户控件中的文本框值则非常耗时,因为这些用户控件中包含大量的文本框。 是否有办法将这些用户控件中的文本框声明为public,而不是protected呢?
5个回答

4

(撇开显而易见的评论,即您所描述的实际上是最佳实践的相反方向...)

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

如果您正在使用Web Site类型的项目,则应该考虑转换为Web Application。 根据Microsoft(并得到经验的支持),Web Site类型不适用于计划编写超出单个代码后的广泛代码的情况。


2
如果我必须这样做,我将编写一个公共属性来公开控件。但通常有一种方法可以重写信息,使您不需要公开内部控件。如果您只需要值,请创建一个返回该值的属性。如果需要客户端ID,则创建一个公开值或事件的客户端对象可能会解决问题。记住,一旦您将其公开,就会暴露契约,并且更改该契约几乎总是令人痛苦的。

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

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设置为public,因为你只需要从父级读取文本值,而不需要将整个对象公开为可读/可写。

0
为什么不将用户控件的一组文本框作为属性公开,并在Init()方法中将所有文本框添加到该集合中呢?
这样,您就拥有了一个集合,如果需要,可以通过ID进行搜索,而无需依赖于任何页面逻辑,并且只需要公开一个属性。如果为其创建自己的集合类,甚至可以编写一些方便的方法以按照所需的方式访问文本框。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接