DropDownList在example.com/Default.aspx上发回,但在example.com/时没有

时间:2012-04-23 20:43:03

标签: c# asp.net drop-down-menu postback

请参阅原始邮件底部的此问题的更新

我有一个页面Default.aspx,它包含一个下拉列表,其中autopostback设置为true,onselectedindexchanged设置为代码隐藏中的方法。这个问题是:

  1. 在ASP.NET 2.0中,它工作正常。 (显示您选择的下拉项目的URL)
  2. 在ASP.NET 4.0 Classic中,它可以正常工作。
  3. 在ASP.NET 4.0 Integrated中,如果您使用文件名访问网站,它可以正常工作,例如: www.example.com/test/Default.aspx)。
  4. 在ASP.NET 4.0 Integrated中,如果您访问没有文件名的网站(例如www.example.com/test/),则无效。具体来说,它似乎是第一次去页面,并显示“你在Page_Load,而不是在回发”
  5. 注意:此页面在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不会运行任何标记有托管处理程序前提条件的托管模块。因此,托管模块不会意外读取实体主体,因此实体主体仍然可用,并传递给子请求和默认文档。

    有没有人对如何实现这个有任何想法?我真的不知道从哪里开始。

0 个答案:

没有答案