请参阅原始消息底部对此问题的更新
我有一个页面 Default.aspx,其中包含一个下拉列表,其中 autopostback 设置为 true,onselectedindexchanged 设置为代码隐藏中的一个方法。这个问题是这样的:
- 在 ASP.NET 2.0 中,它运行良好。(显示您选择的下拉项目的 URL)
- 在 ASP.NET 4.0 Classic 中,它运行良好。
- 在 ASP.NET 4.0 Integrated 中,如果您使用文件名(例如 www.example.com/test/Default.aspx)访问网站,它可以正常工作。
- 在 ASP.NET 4.0 Integrated 中,如果您访问没有文件名的网站(例如 www.example.com/test/),它就不起作用。具体来说,它似乎第一次进入页面并显示“您在 Page_Load,而不是在 Postback 中”
注意:这个页面在 www.example.com 上并不存在,你知道的。
我需要它在 ASP.NET 4.0 Integrated 上工作。有谁知道世界上发生了什么?
我创建了一个简单的页面来演示这一点:
标记:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Test_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Panel ID="pSelectCourse" runat="server">
Select Course:
<asp:DropDownList ID="ddlNews" runat="server" AutoPostBack="True"
OnSelectedIndexChanged="ddlNews_SelectedIndexChanged">
<asp:ListItem Text="-- Select a News Source --" Value="" ></asp:ListItem>
<asp:ListItem Text="CNN" Value="http://www.cnn.com"></asp:ListItem>
<asp:ListItem Text="New York Times" Value="http://www.nytimes.com"></asp:ListItem>
</asp:DropDownList>
</asp:Panel>
</div>
</form>
</body>
</html>
代码隐藏:
public partial class Test_Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
Response.Write("You are in Page_Load on Postback");
else
Response.Write("You are in Page_Load, not on Postback");
}
protected void ddlNews_SelectedIndexChanged(object sender, EventArgs e)
{
Response.Write(ddlNews.SelectedValue);
}
}
更新问题:
此问题在http://asp.net/whitepapers/aspnet4/breaking-changes的 ASP.NET 4 Breaking Changes 页面中进行了讨论. 这是列出的问题:“在 IIS 7 或 IIS 7.5 集成模式下的默认文档中可能不会引发事件处理程序”问题的底部有两个解决方案。第二种是将表单上的action值显式设置为Default.aspx页面。这可行(在上面的代码中尝试查看)但不是特别优雅,并且对于我们拥有的几个在默认文档中具有复杂表单的站点来说是一件痛苦的事情。我想要一个可以全局应用的解决方案,以便“/”和“Default.aspx”被视为相同,就像它们在 2.0 中一样。在 Breaking Changes 页面上还有另一个解决方案,我不明白如何实施,我希望能提供这个全球解决方案:
识别在默认文档请求期间访问请求实体主体的 HTTP 模块,并确定是否可以将其配置为仅对托管请求运行。在 IIS 7 和 IIS 7.5 的集成模式下,通过将以下属性添加到模块的 system.webServer/modules 条目,可以将 HTTP 模块标记为仅对托管请求运行:
前提条件="managedHandler"
对于 IIS 7 和 IIS 7.5 确定为非托管请求的请求,此设置会禁用该模块。对于默认文档请求,第一个请求是对无扩展名的 URL。因此,在初始请求处理期间,IIS 不会运行任何以托管 Handler 为前提条件的托管模块。因此,托管模块不会意外读取实体主体,因此实体主体仍然可用,并被传递给子请求和默认文档。
有人对如何实现这一点有任何想法吗?我真的不知道从哪里开始。