请参阅原始邮件底部的此问题的更新
我有一个页面Default.aspx,它包含一个下拉列表,其中autopostback设置为true,onselectedindexchanged设置为代码隐藏中的方法。这个问题是:
注意:此页面在www.example.com上并不存在,您知道的就是这样。
我需要它来处理ASP.NET 4.0集成。有谁知道这里发生了什么?
我创建了一个简单的页面来演示这个:
标记:
<%@ 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);
}
}
更新问题:
在{4}的ASP.NET 4 Breaking Changes页面上讨论了这个问题。这个问题列为:“IIS 7或IIS 7.5集成模式下的默认文档中可能不会引发事件处理程序”问题的根本是两个解决方案。第二种是将表单上的操作值显式设置为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不会运行任何标记有托管处理程序前提条件的托管模块。因此,托管模块不会意外读取实体主体,因此实体主体仍然可用,并传递给子请求和默认文档。
有没有人对如何实现这个有任何想法?我真的不知道从哪里开始。