gpt4 book ai didi

c# - 在 IHttpModule 中访问 Form 集合会导致事件处理程序不会在默认页面上被调用

转载 作者:行者123 更新时间:2023-11-30 17:18:51 25 4
gpt4 key购买 nike

好吧,这很奇怪。我创建了一个简单的示例站点来演示该问题。在其中,我有一个 Default.aspx 页面,上面有一个按钮:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<p><asp:Button OnClick="ButtonClick" Text="Button" runat="server" />
</p>
<asp:Label ID="output" runat="server" />
</asp:Content>

后面的代码只是在按钮点击时设置标签文本:

    protected void ButtonClick(object sender, EventArgs e)
{
output.Text = "Button Click!!";
}

然后我有一个为每个请求调用的 IHttpModule:

public class SampleModule : IHttpModule
{
public void Dispose()
{
}

public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}

private void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
if(application == null)
{
return;
}
HttpContext context = application.Context;
if(context == null)
{
return;
}

string text = "queryStringParam";

var value = context.Request[text];
var boolValue = value == null;
}
}

同样,这只是一个演示,但这里的要点是,我正在访问请求,以从查询字符串中获取值。如果我在 Cassini 中运行它,一切正常。但是,当我在 IIS 中运行它时,会发生这种情况。当我在以下位置运行网站时:

http://mysamplesite.dev/

然后点击按钮,没有任何反应。页面刚刚重新加载,但我的按钮事件处理程序从未被调用,随后标签文本也从未被更新。但是,如果我在以下位置运行它:

http://mysamplesite.dev/Default.aspx

然后单击按钮,它工作正常并且我的事件处理程序确实被调用了!

在深入研究之后,我将模块中的代码更改为:

string text = "queryStringParam";

var value = context.Request.QueryString[text];
var boolValue = value == null;

注意,这里我直接访问 QueryString 属性,而不是访问 context.Request。当我将其更改为此时,无论我是否在 url 中包含 Default.aspx,它都可以正常工作?!

我做的下一步是,我查看了 Reflector 以查看 HttpRequest 索引器属性的代码实际做了什么:

public string this[string key]
{
get
{
string str = this.QueryString[key];
if (str != null)
{
return str;
}
str = this.Form[key];
if (str != null)
{
return str;
}
HttpCookie cookie = this.Cookies[key];
if (cookie != null)
{
return cookie.Value;
}
str = this.ServerVariables[key];
if (str != null)
{
return str;
}
return null;
}
}

看起来无害,它只是为我检查各种集合,所以我不需要单独检查每个集合。那么我想知道,这些电话中的哪一个打破了它。然后我将我的模块更改为:

string text = "queryStringParam";

var value = context.Request.QueryString[text];
var boolValue = value == null;

var value2 = context.Request.Form[text];
var boolValue2 = value2 == null;

现在又坏了!因此,长话短说,仅通过根据 IHttpModule 中的请求访问 Form 集合,我以某种方式搞砸了 PostBack,事件永远不会被触发。

有人知道为什么会这样吗?我更像是一个 ASP.Net MVC 的人,我不知道 ASP.Net 和它在幕后的所有技巧,足以真正了解为什么会发生这种情况。

最佳答案

  1. 给你的按钮一个ID(运气不好)
  2. 试试 fiddler,看看流量是什么样的 - 这里发生了一些有趣的事情。

关于c# - 在 IHttpModule 中访问 Form 集合会导致事件处理程序不会在默认页面上被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com