ASP.NET 自定义控件:何时调用 LoadPostData()?

2024-06-28

我开发了一个扩展 ListBox 的自定义控件。这个想法是控件“记住”客户端发生的对其元素的修改,例如作为 AJAX 请求的结果。

它的工作方式是控件还呈现隐藏输入,并且 AJAX 请求的结果存储在隐藏输入中。这将被回发,并且控件的 LoadPostData() 方法会查找隐藏输入,如果隐藏输入有数据,则从中创建 ListItem 集合。

这很完美只要用户从列表框中进行了选择。如果没有,则不会调用 LoadPostData() 方法,因此不会创建新的 ListItem 集合。 (我已经使用调试器确定了这一点。)

我假设仅当 POST 数据集合包含与控件的 UniqueID(即 HTML 中的“name”属性)相对应的数据时,才会调用 LoadPostData 方法。如果用户尚未从列表框中进行选择,则列表框的 UniqueID 的发布数据中不会包含任何内容,并且不会调用 LoadPostData()。那是对的吗?

任何人都可以建议我如何确保每次回发都会调用我的自定义 ListBox 的 LoadPostData() 方法,无论用户是否做出选择?

预先感谢 - 我真的被这个问题困扰了。

David


我在这方面有点晚了,但是,仅供将来参考,以下是我如何完成类似的事情......

我的控件是一个使用节点模板的树。我处理的问题是如何捕获客户端对节点展开/折叠状态的更改。最终起作用的是:

在 CreateChildControls 中,将隐藏字段添加到我的根控件的控件集合中。

protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)
{
    ...
    _cdExpanded = new HiddenField();
    _cdExpanded.ID = "cdExpanded";
    this.Controls.Add(_cdExpanded);
    ...
}

在 OnInit 调用中

protected override void OnInit(EventArgs e)
{
    ...
    Page.RegisterRequiresPostBack(this);
    ...
}

在 LoadPostData 中查找帖子集合中与隐藏字段的 UniqueID(不是 ClientID)相匹配的值:

public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
    ...
    string cdExpanded = postCollection[_cdExpanded.UniqueID];
    ...
}

在各个节点的类中,我有代码通过调用 JavaScript 函数来填充切换按钮的 onclick 事件,该函数将基本控件的 ID 和各个节点作为参数。

    string ToggleScript
    {
        get
        {
            return "ToggleNode('" + this.ClientID + "', '" + _TreeRoot.ClientID + "');";
        }
    }
    protected override void Render(HtmlTextWriter writer)
    {
        ...
        if (this.HasChildren)
        {
            writer.AddAttribute("onclick", ToggleScript);
        }
        ...
    }

这使得通过 getElementById 查找隐藏字段相当容易:

function ToggleNode(nodeID, treeID) {
var cdExpanded = document.getElementById(treeID + "_cdExpanded");
...
}

然后,JavaScript 根据发生的事件的需要修改隐藏字段的值。当我们返回服务器时,我能够解析该字段的内容,并在再次渲染之前根据需要修改控件状态。 (注意:我实际上使用 3 个隐藏字段来跟踪不同的事件,但概念是相同的)

希望这可以帮助其他人在未来......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET 自定义控件:何时调用 LoadPostData()? 的相关文章

随机推荐