我创建了一个由我的所有用户控件实现的基本用户控件(BaseUserControl)类。在该类中,我有一个包含JavaScript URL引用的集合的属性。解析该类型用户控件的页面的最佳方法是什么?
我尝试使用LINQ,但我认为我不能用它来查询Controls集合:
var controls = (from c in page.Controls where c is BaseUserControl)
foreach(control in controls){
var javascript = control.JavaScriptReference
}
答案 0 :(得分:5)
稍微更惯用的方法是使用Enumerable.OfType。
foreach(var control in page.Controls.OfType<BaseUserControl>()) {
var javascript = control.JavaScriptReference;
}
答案 1 :(得分:3)
var javascript = page.Controls.OfType<BaseUserControl>().Select(c=> c.JavaScriptReference);
这应该有效。
答案 2 :(得分:1)
如果您只想要一组JavaScriptReference值,您可以执行以下操作:
var javascriptReferences = page.Controls.Where(c => c is BaseUserControl)
.Select(c => c.JavaScriptReference);
答案 3 :(得分:1)
我使用递归方法来解决这个问题。请参阅下面我通常使用的方法。
private void GetControls<T>(Control ctrl, List<T> result)
{
foreach (Control con in ctrl.Controls.OfType<Control>().Where(c => c.Controls.Count > 0))
GetControls<T>(con, result);
foreach (T control in ctrl.Controls.OfType<T>())
result.Add(control);
}
您可以这样称呼它:
List<BaseUserControl> baseUserControls = new List<BaseUserControl>();
GetControls<BaseUserControl>(Page.Controls, out baseUserControl);
之后,List将填充对BaseUserControls的引用。递归方法是必要的,因为Page.Controls
不包含页面上的所有控件。页面上的某些控件是此集合中的控件的子级(甚至是这些控件的子级),因此嵌套级别更深。因此递归方法。
答案 4 :(得分:0)
您是否正确选择了控件?
var controls = (from c in page.Controls where c is BaseUserControl select c)
foreach(BaseUserControl control in controls)
{
var javascript = control.JavaScriptReference
}
答案 5 :(得分:0)
foreach (var control in
page.Controls.OfType<BaseUserControl>())
{
var javascript = control.JavaScriptReference;
}