我正在尝试使用http模块来禁用每个页面的文本框。这是我的样本编码
public void context_OnPreRequestHandlerExecute(object sender, EventArgs args)
{
try
{
HttpApplication app = sender as HttpApplication;
if (app != null)
{
Page page = app.Context.Handler as Page;
if (page != null)
{
page.PreRender += OnPreRender;
page.PreLoad += onPreLoad;
}
}
}
catch (Exception ex)
{
throw new ApplicationException(ex.Message);
}
}
public void OnPreRender(object sender, EventArgs args)
{
Page page = sender as Page;
if (page.IsCrossPagePostBack)
{
DisableAllTextBoxes(page);
}
}
private static void DisableAllTextBoxes(Control parent)
{
foreach (Control c in parent.Controls)
{
var tb = c as Button;
if (tb != null)
{
tb.Enabled = false;
}
DisableAllTextBoxes(c);
}
}
这个编码可以很好地工作,但是当我将server.transer用于另一个页面时。按钮无法禁用。 例如webform1转移到webform2。 Webform 1的按钮可以禁用,但webform2无法禁用。谁能解决我的问题?
答案 0 :(得分:0)
Server.Transfer()
在ControlCollection上创建一个返回IEnumerable
的扩展方法。这处理递归。然后你就可以在你的页面上使用它:
var textboxes = this.Controls.FindAll().OfType<TextBox>();
foreach (var t in textboxes)
{
t.Enabled = false;
}
...
public static class Extensions
{
public static IEnumerable<Control> FindAll(this ControlCollection collection)
{
foreach (Control item in collection)
{
yield return item;
if (item.HasControls())
{
foreach (var subItem in item.Controls.FindAll())
{
yield return subItem;
}
}
}
}
}
取自this answer。
答案 1 :(得分:0)
Server.Transfer
是否不通过所有http模块管道(这就是为什么不执行context_ PreRequestHandlerExecute)
您应该尝试Server.TransferRequest
或response.redirect
或HttpContext.Current.RewritePath