【问题标题】:ASP.NET user control list/collection/array propertyASP.NET 用户控件列表/集合/数组属性
【发布时间】:2023-04-08 08:15:01
【问题描述】:

我创建了用户控件。它具有 string[] 公共属性(可能是 List<string> 或其他)。在声明此用户控件的实例时,我想支持在 aspx 代码中定义此属性。像这样的:

<uc1:MyControl ID="MyControl1" runat="server">
    <MyStringCollectionProperty>
        <string>My String 1</string>
        <string>My String 2</string>
        <string>My String 3</string>
    </MyStringCollectionProperty>
</uc1:MyControl>

如何让它发挥作用?谢谢...

【问题讨论】:

  • 你想达到什么目的?你不能只在代码隐藏中设置属性吗? (例如 MyControl1.MyCollection = new List { "Foo", "Bar" };) 或 " runat="server"/>
  • 当然,我可以在代码隐藏中将该属性设置为“紧急选项”。我想要的是将 UI 声明与逻辑分开。关于您的第二个选项(“”表达式。

标签: asp.net list user-controls properties


【解决方案1】:

您实际上可以使用 TypeConverterAttribute 来指定转换器类(在本例中为 StringArrayConverter)。

【讨论】:

    【解决方案2】:

    据我所知,你不能用用户控件做你想做的事。您需要编写一个自定义控件。

    请参阅 MSDN 上的 Server Control Properties Example

    【讨论】:

      【解决方案3】:

      下面是一个示例,说明如何完成您的要求。子控件作为 HTMLGeneric 控件读入,因此您必须转换它们。在读入它们时,我将它们转换为我的自定义“StringControl”类。如果你想使用更高级的结构,你可以增强字符串控件的构造函数。

      Partial Class UserControlStrings_MyControl
          Inherits System.Web.UI.UserControl
      
          Private _MyStringCollectionProperty As New MyUserControlStringCollectionClass(Me)
      
          <PersistenceMode(PersistenceMode.InnerProperty)>
          Public ReadOnly Property MyStringCollectionProperty As MyUserControlStringCollectionClass
              Get
                  Return _MyStringCollectionProperty
              End Get
          End Property
      End Class
      
      Public Class MyUserControlStringCollectionClass
          Inherits ControlCollection
      
          Sub New(ByVal owner As Control)
              MyBase.New(owner)
          End Sub
      
          Public Overrides Sub Add(ByVal child As System.Web.UI.Control)
              MyBase.Add(New StringControl(child))
          End Sub
      End Class
      
      Public Class StringControl
          Inherits HtmlGenericControl
      
          Sub New(ByVal GenericControl As HtmlGenericControl)
              MyBase.New()
              Me.Value = GenericControl.InnerHtml
          End Sub
      
          Public Property Value As String = String.Empty
      
          Public Overrides Function ToString() As String
              Return Value
          End Function
      End Class
      

      然后您可以在“MyControl1.MyStringCollectionProperty”中查找所有值。

      【讨论】:

        【解决方案4】:

        根据您的示例,通过在标记中明确输入变量值,您可以直接将您的 UI 与您的逻辑相结合。

        如果这些值永远不会改变,那么将它们放入标记中是没有意义的——最好将它们放入用户控件的代码中。

        如果每次加载用户控件时这些值可能不同,那么它们应该来自动态源,例如会话状态变量、公共变量、控件值等。(在这种情况下,您的用户控件看起来每次加载时都将它们打开。)

        如果这些值仅在设计时发生变化,您仍然可以像上面一样将它们设置为 onload,但在这种情况下您可能会考虑构建一个“自定义控件”。

        无论如何,不​​确定您要达到的具体目标,因此希望这些选项之一可以提供帮助。

        祝你好运

        【讨论】:

        • 其实这个属性和业务逻辑没有紧密的联系。它仅代表此用户控件的设置之一。但是,现在在 page_load 中设置这个属性让我很满意。 :) 谢谢你的建议。
        【解决方案5】:

        Custom User Control and Friendly Property Item Collection (Like ListBox and ListItems, but with List<Class>) on .ASPX

        您可以使用集合,也可以使用列表。

        一定要检查http://msdn.microsoft.com/en-us/library/9txe1d4x%28v=vs.100%29.aspx - 它非常适用于用户控制,在上面的stackoverflow链接上我解释了如何在aspx页面或webconfig中链接

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-12
          • 1970-01-01
          • 2011-05-28
          • 2014-04-07
          相关资源
          最近更新 更多