【问题标题】:Stumped With Custom Property on User Control难倒用户控件上的自定义属性
【发布时间】:2011-12-30 06:22:13
【问题描述】:

我创建了一个 ASP.NET 用户控件。当我明确提供自定义属性的值时,该值将传递给控件。但是,当我尝试使用数据源中的值时,该值不会传递给控件。

用户控件位于 FormView 中。 FormView 成功显示基础记录。我正在尝试将 FormView 数据源中的列中的值传递给控件。这行得通

<asp:formview .... />
<editTemplate>
<uctrl:DateSelector ID="DateSelector1" runat="server" DateValue="5/30/2011" /><br /> 
<%#Eval("MilestoneDate")%>    
</editTemplate>
</asp:formview>

这不是……

<asp:formview .... />
<editTemplate>
<uctrl:DateSelector ID="DateSelector1" runat="server" DateValue='<%#Eval("MilestoneDate")%>' /><br /> 
<%#Eval("MilestoneDate")%>   
</editTemplate>
</asp:formview>

我已经确认 MileStoneDate 确实有一个值。无论出于何种原因,该值都没有传递给控件,​​但是该控件确实可以识别文字值。

Imports Microsoft.VisualBasic 
Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Web.UI 
Imports System.ComponentModel 

Partial Class content_WebUserControl 
    Inherits System.Web.UI.UserControl 
    <Bindable(True, BindingDirection.OneWay)> 
    Public Property DateValue() As String 
        Get 
            Return _DateValue 
        End Get 
        Set(ByVal value As String) 
            _DateValue = value 
        End Set 
    End Property 
    Private _DateValue As String 
    Protected Sub Page_Load() Handles Me.Load 

        If IsDate(Me.DateValue) Then 
            Dim NewDate As DateTime = CDate(Me.DateValue) 
            LabelSelectedDateDisplay.Text = Me.DateValue 
            LabelSelectedDateDisplay_DayOfWeek.Text = NewDate.ToString("dddd") 
            TextBoxSelectedDate.Text = Me.DateValue 
        Else 
            LabelSelectedDateDisplay.Text = "" 
            LabelSelectedDateDisplay_DayOfWeek.Text = "" 
            TextBoxSelectedDate.Text = "" 
        End If 

    End Sub 


End Class

我在此 URL ASP.NET User Control : can't initialize a user control property using Eval("...") 上被提及该帖子

但是,根据我对帖子的理解,我所拥有的应该可以工作。

【问题讨论】:

    标签: asp.net controls


    【解决方案1】:

    您需要使用 ViewState 在页面请求之间保持 DateValue。

    Public Property DateValue() As String 
       Get 
            IF IsNothing(ViewState("datevalue") Then
               return String.Empty
            End If
            return ViewState("datevalue").ToString()
       End Get 
       Set(ByVal value As String) 
           ViewState("datevalue")=value
       End Set 
    End Property 
    

    或者直接将值存储到控件中:

     Public Property DateValue() As String 
        Get 
              Return LabelSelectedDateDisplay.Text
        End Get 
        Set(ByVal value As String) 
          If IsDate(value) Then 
                Dim NewDate As DateTime = CDate(value) 
                LabelSelectedDateDisplay.Text = NewDate 
                LabelSelectedDateDisplay_DayOfWeek.Text = NewDate.ToString("dddd") 
                TextBoxSelectedDate.Text = NewDate 
            Else 
                LabelSelectedDateDisplay.Text = "" 
                LabelSelectedDateDisplay_DayOfWeek.Text = "" 
                TextBoxSelectedDate.Text = "" 
            End If          
        End Set 
    End Property 
    

    【讨论】:

    • 我不认为你的第一句话是真的,是不是默认情况下为自定义控件及其属性启用了 ViewState ?我认为第二种解决方案会起作用,因为只要通过绑定表达式设置属性(在 formview 绑定时),就会设置 UserControl 的成员属性,但我不确定这是否是一种常见的代码模式。我觉得有点奇怪。
    • @pseudocoder - 此 Web 用户控件,您必须为自定义属性显式地将值设置为 ViewState。在 OP 代码的 Page_Load 中检查每个请求的 DateValue 属性。重要的一点是,Page_Load 事件在 DateValue 分配之前被调用,这就是我建议第二种方法的原因。
    • 命名子“Page_Load()”是用词不当,因为从技术上讲,它是一个正在加载的用户控件。为了清楚起见,我将对其进行更改。控件实际上并不作用于值本身。它是一组控件组合在一起,以最大限度地减少捕获日期所需的工作量(在此版本中)。
    • @AVD 感谢您提供信息。我对此进行了测试,您是正确的,您必须在 UserControls 上手动保留自定义属性。但在这种情况下,OP 并不希望保留值,因为绑定表达式将在每次回发时设置该属性。
    【解决方案2】:

    问题是直到 Page.Load 之后才在表单视图上发生数据绑定,并且您在此期间检查属性的值。如果要在 Page.Load 中设置值,则需要使用 FormView.Databind() 手动绑定。

    或者,您可以将您在自定义控件中列出的代码从处理 Page.Load 更改为处理 Page.Prerender,前提是无需提前执行该代码。

    【讨论】:

    • @David C. Holley 不客气!如果您觉得我的回答回答了您的问题,请记得接受。
    【解决方案3】:

    看起来问题可能与时间/事件有关。

    当您使用&lt;%# %&gt; 设置属性时,该值会在控件的数据绑定事件期间分配给该属性。如果您在Page_Load() 时间寻找它,它还不会在那里。

    如果您更改代码以检查 PreRender 事件中的值,它应该在那里。

    【讨论】:

    • 我认为这与我的答案基本相同,所以我同意!
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2014-11-26
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多