我目前正在尝试在ASP.NET复合控件中添加FilteredTextBoxExtender,但我无法让它工作。
我在重写的CreateChildControls方法中有以下代码:
var textbox = new TextBox { ID = string.Format("{0}_textbox", ID);
var filteredTextBoxExtender = new FilteredTextBoxExtender { ID = string.Format("{0}_filter", ID), TargetControlID = textbox.ID, FilterType = FilterTypes.Numbers };
Controls.Add(textbox);
Controls.Add(filteredTextBoxExtender);
不知何故,当我查看测试页面的来源时看起来它是正确添加的,但它不会触发过滤
Sys.Application.add_init(function() {
$create(AjaxControlToolkit.FilteredTextBoxBehavior, {"FilterType":2,"id":"ctl00_testTextBox_testTextBox_filter"}, null, null, $get("ctl00_testTextBox_testTextBox_textBox"));
});
...
<input id="ctl00_testTextBox" name="ctl00$testTextBox$testTextBox_textBox" type="text" value="" id="ctl00_testTextBox_testTextBox_textBox" />
知道这里发生了什么,以及如何让它解雇过滤?
编辑: 我已经将其缩小到动态选择要渲染的控件的问题。如果我明确地渲染每个子控件,FilteredTextBoxExtender可以工作,但如果我不在复合控件中渲染其中一个子控件(标签控件),则不能工作
答案 0 :(得分:1)
试试这个:
问题是文本框的ID。如果您检查生成的JavaScript,您可以感觉到,输入ID与指定的ID不同$get("ctl00_testTextBox_testTextBox_textBox")
。所以你的代码不起作用。 您应该通过INamingContainer marker inerface标记复合控件。因此,复合控件的id与添加的文本框ID相结合,并生成唯一的标识。它解决了这个问题。
public class Foo : CompositeControl
{
protected override void CreateChildControls()
{
var textbox = new TextBox { ID = "textbox" }
var filteredTextBoxExtender = new FilteredTextBoxExtender { TargetControlID = textbox.ID, FilterType = FilterTypes.Numbers };
Controls.Add(textbox);
Controls.Add(filteredTextBoxExtender);
}
}