我有一个继承自.NET的CompositeControl类的自定义控件。此控件将覆盖CreateChildControl,以便动态构建其子控件。我需要在客户端发生几个不同的javascript事件后回发页面。
为了实现这一点,我在页面上创建了两个隐藏控件,以便我可以使用javascript设置它们的值,提交页面,并在服务器端读取值。这是我用来创建这两个隐藏的代码:
Protected Overrides Sub CreateChildControls()
hdEventName = New HiddenField()
Controls.Add(hdEventName)
hdEventName.ID = "hdEventName"
hdEventArgs = New HiddenField()
Controls.Add(hdEventArgs)
hdEventArgs.ID = "hdEventValue"
' other controls
' ...
End Sub
当javascript事件发生时,我设置两个hiddens的value属性并提交页面,如下所示:
hdEventName.value = 'EventName';
hdEventArgs.value = 'arg1,arg2';
document.forms[0].submit();
在我的控件的OnLoad方法中,我尝试检查hdEventName和hdEventArgs控件的Value属性,但它始终为空。但是,Page.Request.Form(hdEventName.UniqueID)和Page.Request.Form(hdEventArgs.UniqueID)返回正确的值。标记后的实际HTML也会在页面回发后显示正确的值。
为什么HtmlInputHiddens的Value属性与客户端上显示的实际值断开连接?
更新 看起来,在OnLoad发生之后,控件的属性会从表单中加载。因此,我能够通过将检查两个隐藏字段的代码移动到OnPreRender方法中,或者将以下方法添加到我的代码中来解决我的问题 -
Private Sub Event_Handler(ByVal sender As Object, ByVal e As EventArgs)
Handles hdEventName.ValueChanged
' do stuff with hiddens
' ...
' reset the values back
hdEventName.Value = String.Empty
hdEventArgs.Value = String.Empty
End Sub
答案 0 :(得分:0)
当页面回发时,没有任何内容可以将变量hdEventName链接到您之前创建的控件。你正在做的是类似于在类级别声明一个整数并在创建子控件时将其设置为5。在回发中没有什么可以保持该变量的值。
如果您想获得之前创建的控件的引用,则必须使用
hdEventName = CType(Page.FindControl("hdEventName") , HiddenField)
(我猜这个)或请求,如果你只关心价值。
答案 1 :(得分:0)
似乎在OnLoad发生后的某个时间从表单加载控件的属性。因此,我能够通过将检查两个隐藏字段的代码移动到OnPreRender方法中,或者将以下方法添加到我的代码中来解决我的问题 -
Private Sub Event_Handler(ByVal sender As Object, ByVal e As EventArgs)
Handles hdEventName.ValueChanged
' do stuff with hiddens
' ...
' reset the values back
hdEventName.Value = String.Empty
hdEventArgs.Value = String.Empty
End Sub