元のメッセージの下部にあるこの質問の更新を参照してください
autopostback が true に設定され、onselectedindexchanged がコード ビハインドのメソッドに設定されたドロップダウン リストを含む Default.aspx ページがあります。この問題は次のとおりです。
- ASP.NET 2.0 では問題なく動作します。(選択したドロップダウン項目の URL が表示されます)
- ASP.NET 4.0 Classic では、問題なく動作します。
- ASP.NET 4.0 Integrated では、www.example.com/test/Default.aspx などのファイル名を使用して Web サイトにアクセスすると問題なく動作します。
- ASP.NET 4.0 Integrated では、ファイル名を指定せずに Web サイト (例: www.example.com/test/) にアクセスすると、機能しません。具体的には、初めてのようにページに移動し、「PostbackではなくPage_Loadにいます」と表示するようです
注: このページは 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);
}
}
質問への更新:
この問題は、 http://asp.net/whitepapers/aspnet4/breaking-changesの ASP.NET 4 の破壊的変更ページで説明されています。. これは、「IIS 7 または IIS 7.5 統合モードの既定のドキュメントでイベント ハンドラーが発生しない可能性がある」としてリストされている問題です。問題の最後に 2 つの解決策があります。2 つ目は、フォームのアクション値を Default.aspx ページに明示的に設定することです。これは機能しますが (上記のコードで試してみてください)、特に洗練されたものではなく、既定のドキュメントに複雑なフォームが含まれているいくつかのサイトでは首の痛みです。「/」と「Default.aspx」が 2.0 の場合と同じように扱われるように、グローバルに適用できるソリューションが必要です。Breaking Changes ページには、この上に別の解決策があります。実装方法がわかりませんが、このグローバルな解決策を提供することを望んでいます。
既定のドキュメント リクエスト中にリクエストのエンティティ ボディにアクセスしている HTTP モジュールを特定し、マネージド リクエストに対してのみ実行するように構成できるかどうかを判断します。IIS 7 と IIS 7.5 の両方の統合モードでは、HTTP モジュールは、モジュールの system.webServer/modules エントリに次の属性を追加することで、管理された要求に対してのみ実行するようにマークできます。
precondition="managedHandler"
この設定は、IIS 7 および IIS 7.5 が管理されていない要求であると判断した要求のモジュールを無効にします。デフォルトのドキュメント リクエストの場合、最初のリクエストは拡張子のない URL に対するものです。したがって、IIS は、最初の要求処理中にマネージ Handler の前提条件でマークされたマネージ モジュールを実行しません。その結果、マネージ モジュールがエンティティ本体を誤って読み取ることがなくなり、エンティティ本体が引き続き使用可能になり、子要求および既定のドキュメントに渡されます。
これを実装する方法について誰かアイデアがありますか? どこから始めればいいのか本当にわかりません。