1

我有一个继承自 .NET 的 CompositeControl 类的自定义控件。此控件覆盖 CreateChildControls 以便动态构建其子控件。在客户端发生几个不同的 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 事件时,我设置两个隐藏项的 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
4

2 回答 2

0

当页面回发时,没有任何东西可以将变量 hdEventName 链接到您之前创建的控件。您所做的类似于在类级别声明一个整数并在创建子控件时将其设置为 5。没有什么可以在回发中维护该变量中的该值。

如果您想获得对之前创建的控件的引用,则必须使用

hdEventName = CType(Page.FindControl("hdEventName") , HiddenField)

(我猜这个)或 Request 如果你只关心价值。

于 2010-03-16T20:37:58.703 回答
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
于 2010-03-16T20:57:56.670 回答