我有一个要求,我想跟踪.net运行时正在处理的文件。我的意思是如果它正在处理usercontrol x.ascx然后它应该返回它的整个路径,如果它正在处理usercontrol y.ascx它应该返回它。
有一些候选属性。
Request.AppRelativeCurrentExecutionFilePath
或
TemplateControl.AppRelativeVirtualPath.
有人可以帮我这个,还是有任何其他财产可以给我这条路。
答案 0 :(得分:2)
Request.AppRelativeCurrentExecutionFilePath
应该做你需要的。它会产生意想不到的结果吗?
您应该能够通过枚举当前页面处理程序的Controls集合来检索当前正在执行的任何UserControl。假设有一个外部上下文,这是一个应该有效的例子:
public static string[] GetCurrentUserControlPaths() {
if(HttpContext.Current == null) return new string[0];
if(!(HttpContext.Current.Handler is Page)) return new string[0];
var page = (HttpContext.Current.Handler as Page);
var paths = ControlAggregator(page, c => c is UserControl).Cast<UserControl>().Select(uc => uc.AppRelativeVirtualPath);
if(page.Master != null) {
paths.Concat(ControlAggregator(page.Master, c => c is UserControl).Cast<UserControl>().Select(uc => uc.AppRelativeVirtualPath));
}
return paths.ToArray();
}
public static Control[] ControlAggregator(this Control control, Func<Control, bool> selector) {
var list = new List<Control>();
if (selector(control)) {
list.Add(control);
}
foreach(Control child in control.Controls) {
list.AddRange(ControlAggregator(child, selector));
}
return list.ToArray();
}