Asp.net 用户控件上的自定义属性

Asp.net 用户控件上的自定义属性,asp.net,controls,Asp.net,Controls,我已经创建了一个ASP.NET用户控件。当我明确地为自定义属性提供值时,该值将传递给控件。但是,当我尝试使用数据源中的值时,该值不会传递给控件 用户控件位于FormView中。FormView成功地显示了基础记录。我试图从FormView的数据源向控件传递列中的值。这很有效 <asp:formview .... /> <editTemplate> <uctrl:DateSelector ID="DateSelector1" runat="server" DateVa

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

用户控件位于FormView中。FormView成功地显示了基础记录。我试图从FormView的数据源向控件传递列中的值。这很有效

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


然而,根据我对这篇文章的理解,我所拥有的应该是有效的。

您需要使用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 

问题是在Page.Load之后才会在formview上进行数据绑定,并且在此期间您正在检查属性的值。如果希望在Page.Load中设置值,则需要使用
FormView.Databind()
手动绑定


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

问题可能与时间/事件有关

使用
设置属性时,在控件的数据绑定事件期间会将该值指定给该属性。如果您在
Page\u Load()
时间上查找它,它还不会在那里


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

我认为您的第一条语句不是真的,默认情况下,自定义控件及其属性不是启用了ViewState吗?我认为第二种解决方案是可行的,因为只要通过绑定表达式(在formview绑定时)设置属性,就会设置UserControl成员的属性,但我不确定这是否是一种常见的代码模式。我觉得有点奇怪。@pseudocoder-这个web用户控件,您必须为自定义属性显式地将值设置为ViewState。在每个请求上,DateValue属性都在OP代码的加载页中检查。重要的一点是,Page_Load事件是在DateValue赋值之前调用的,这就是我建议使用第二种方法的原因。将子项命名为“Page_Load()”是一个误称,因为从技术上讲,它是一个正在加载的用户控件。为了清楚起见,我将改变这一点。控件实际上并不作用于值本身。这是一组控件组合在一起,以尽可能减少捕获日期所需的工作量(在此版本中)。@AVD感谢您提供的信息。我对此进行了测试,您是正确的,您必须在UserControls上手动保留自定义属性。但是在本例中,OP并不希望持久化值,因为绑定表达式将在每次回发时设置该属性。我认为这与我的答案基本相同,所以我同意@大卫·C·霍利,不客气!如果你觉得我的回答已经回答了你的问题,请记住接受我的回答。
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