【问题标题】:How can I assign a property value based on another property in a composite control?如何根据复合控件中的另一个属性分配属性值?
【发布时间】:2015-09-09 19:24:49
【问题描述】:

环境:Asp.net 4.5,Webforms

我正在创建一个复合控件。我已经暴露了多个公共属性,但遇到了一个小问题。

假设我有两个属性:

Public Property Path() As String
   Get
       Return ViewState("Path")
   End Get
   Set(ByVal Value As String)
       If UseAbsolute = True Then
           ' do something
       Else
           ' it always lands heere...
       End If
   End If
   ViewState("Path") = Value
   End Set
End Property
Private _Path As String = String.Empty

Public Property UseAbsolute() As Boolean
    ....
End Property
Private _UseAbsolute As Boolean = False

我的控件在 PreRender 上被赋值。问题是,当我调用“路径”时,它会获取 UseAbsolute 的默认/私有值。因此,即使我在控件/html 中将属性设置为 True,它也会先获取 false。

我可以通过多种方式解决这个问题,但我觉得我缺少正确的方法或理解。

更新

我忘了提。我是:

EnsureChildControls()

在预渲染中...

我也尝试将其添加到属性本身。

【问题讨论】:

  • 我也想知道是否有解决方案。您可能的解决方法之一是我正在做的事情——我的属性只是 getter 和 setter。我正在处理CreateChildControls() 内部的所有逻辑
  • @onskee 给我点赞?也许天才会出现,让我们觉得很傻。
  • 我认为如果其中一个属性可用,那么所有属性都是可用的。

标签: asp.net vb.net composite-controls


【解决方案1】:

你的代码不应该是这样,而不是你有它吗?

Private _Path As String = String.Empty
Private _UseAbsolute As Boolean = False
'
Public Property Path() As String
  Get
    Return _Path
  End Get
  Set(ByVal Value As String)
    If UseAbsolute = True Then
      ' do something
      _Path = some_absolute_path
    Else
      ' do something else
      _Path = some_relative_path
    End If
  End Set
End Property
'
Public Property UseAbsolute () As Boolean
  Get
    Return _UseAbsolute
  End Get
  Set(ByVal Value As Boolean)
    _UseAbsolute = Value
  End Set
End Property

【讨论】:

  • 我已经看到了这两种方式,与公众分开,并且在每个公共财产下多次。这不是更多的组织偏好吗?从技术上讲,我的代码和你的一样,所以这不是问题......但它有什么相关性吗?
  • 略有不同,用于存储值的变量以下划线开头,属性方法没有。在您的代码中,属性方法和变量都具有相同的名称!我认为最好先声明变量,然后再声明属性方法。你有没有尝试过我的解决方案?
  • 其实据我了解,我是用long方法写东西,因为下划线的private是推断出来的,并不是说完全写出来有什么问题。关于“你有没有尝试过我的解决方案?”,我在第一条评论中说“从技术上讲,我的代码和你的一样,所以这不是问题”。我不相信,但很想被证明是错误的。我认为放置与它没有任何关系(对于大多数/常见情况)
  • 我还认为,如果一个属性可用,其他属性就会可用。我正在寻找我是否在其他地方犯了错误。感谢您的帮助。
  • 啊哈。我确实在我的示例中发现了一个错字,缺少 _Path 上的下划线...这是您所指的问题之一吗?这在我的真实代码中是正确的,只是在此处输入示例时错过了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多