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