0

一点背景:

我一直在研究 Umbraco 的自定义数据类型。数据类型显示特定类型的节点列表,并允许用户从该列表中进行选择。我试图使这种数据类型可重用,这样我就不必为我希望列出的每种类型的节点创建一个单独的数据类型。我只需创建此数据类型的属性并设置要显示的节点类型。

数据类型是一个 UpdatePanel,其中包含一个复选框列表(用于每个要选择的节点)和一个用于在选择中添加/删除这些节点的按钮。

例如,如果我有一个帖子,我可以添加此数据类型并将其设置为列表类别,这允许我将帖子与类别列表相关联。如果我想再有这个数据类型的另一个实例,比如选择作者,我开始遇到问题。

数据类型结构信息

这应该提供有关如何构建此控件的更多详细信息。它使用3 类方法来创建 umbraco 数据类型,因此我没有 .ascx 文件,只有一个 .cs 文件,它以编程方式将元素呈现到页面上。

通过遍历节点列表并呈现以下内容来呈现复选框:

<input type='checkbox' name='select_nodes' value='" + n.Id + "' />

然后我渲染两个按钮,一个用于将节点添加到选定节点列表中,另一个用于删除它们(我只是在此处显示添加)。这个按钮简单地获取 Form["select_nodes"] 的值,它包含一个逗号分隔的节点 ID 列表,并且对于每一个,将其添加到单独的节点列表中。

按钮添加如下:

public override void OnInit(EventArgs e)
{
    //Add Button
    btn_Add = new Button();
    btn_Add.CssClass = "btn_add";
    btn_Add.ID = "btnAdd" + Guid.NewGuid();
    btn_Add.Text = "Add >>";
    btn_Add.Click += new EventHandler(selectNodes);
    base.ContentTemplateContainer.Controls.Add(btn_Add);
}

上面描述了这个控件的基本形式,希望能对设置提供更多的了解。

问题

在加载具有此数据类型的多个实例的节点时,如上例所示,由于重复的控制 ID 会发生错误,我通过将随机 guid 附加到 ID 来克服这个问题。现在的问题是选择/取消选择节点的按钮似乎不起作用。我假设这是由于这些按钮有多个实例,并且对触发哪个事件感到困惑?

有没有办法解决这个问题?为了避免跨控件的多个实例的干扰?

谢谢,

4

3 回答 3

1

以下是一些您可能会发现有用的资源:

于 2012-07-13T15:41:16.230 回答
1

我认为问题是每次您的页面回发时都会再次生成您的控件,并且由于每次都会附加 Guid.NewGuid() ,因此它们最终会以不同的 ID 结束。当页面回发时,它会为您单击的按钮运行 findcontrol,然后从中获取事件处理程序,但如果按钮的 ID 已更改,它将找不到它并且随后找不到它的事件处理程序。

使这种情况起作用的最佳方法不是生成随机字符串以附加到控件名称,而是使用您可以在按钮创建的上下文中控制的已知常量。因此,如果它是列表项的按钮,您每次都将“li”附加到它,或者类似的东西。然后您知道在每次回发时您的控件都具有相同的名称 - 但对于它自己的实例来说仍然是唯一的。

于 2012-07-13T23:30:04.713 回答
0

成功

正如@Infotekka 在下面的评论中指出的那样:

我认为问题是每次您的页面回发时都会再次生成您的控件,并且由于每次都会附加 Guid.NewGuid() ,因此它们最终会以不同的 ID 结束。当页面回发时,它会为您单击的按钮运行一个 findcontrol,然后从中获取事件处理程序,但如果按钮的 ID 已更改,它将找不到它并且随后找不到它的事件处理程序

作为回应,我替换了:

btn_Add.ID = "btnAdd" + Guid.NewGuid();

btn_Add.ID = "btnAdd_" + targetDocType.ToLower();

继上面的示例之后,这会导致此控件/数据类型的一个实例具有添加/删除按钮,ID 为“btnAdd_Category”和“btnRemove_Category”,而在另一个实例中,ID 为“btnAdd_Author”和“btnRemove_Author”。

最初这并没有解决问题,但在进一步调查中,我有一个 LiteralControl,我将它添加到页面中以包含一些嵌入式 css,并且这个 id 也需要每个实例都是唯一的。

感谢@Infotekka 指出问题的根源,感谢@dludlow 提供链接!

@Infotekka,如果您将之前的评论作为答案发布,我可以将其标记为答案:)

于 2012-07-13T18:54:35.290 回答