選択したインデックスが変更され、サーバーに正常にポストバックされると、ポストバックをトリガーするビジュアル スタジオ プロジェクト (.NET Framework 3.5) に単純な ASP.NET ドロップダウン リスト コントロールがあります。同じ単純な ASP.NET ドロップダウン リスト コントロールを使用して、ビジュアル スタジオ プロジェクトを .NET Framework 4.0 にアップグレードすると、ポストバックは発生しません。以下は、ページ上のマークアップのサンプルです (ページにはドロップダウン リストのみが含まれます)。
<body>
<form id="form1" runat="server" >
<asp:DropDownList ID="ddlTest" OnSelectedIndexChanged="ddlTestIndexChanged" runat="server"
AutoPostBack="true" />
</form>
</body>
そしてコードビハインドで....
public void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
var list = new List<string>();
list.Add("Hello");
list.Add("World");
ddlTest.DataSource = list;
ddlTest.DataBind();
}
}
protected void ddlTestIndexChanged(object sender, EventArgs e)
{
//selected index changed...success
}
プロジェクトが .NET Framework 3.5 で実行されている場合、FireBug を使用してブラウザーでレンダリングされた html を表示すると、次の html が表示されます。
<body>
<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="">
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="">
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="has a value">
</div>
<script type="text/javascript"> //<![CDATA[ var theForm = document.forms['form1'];
if (!theForm) { theForm = document.form1; } function __doPostBack(eventTarget, eventArgument)
{ if (!theForm.onsubmit || (theForm.onsubmit() != false))
{ theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit(); } } //]]> </script>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="Has a value">
</div>
<select name="ddlTest" onchange="javascript:setTimeout('__doPostBack(\'ddlTest\',\'\')', 0)" id="ddlTest">
<option value="Hello">Hello</option>
<option selected="selected" value="World">World</option>
</select>
</form>
</body>
同じプロジェクトを .NET Framework 4.0 で実行すると、レンダリングされた html が表示されます。
<body>
<form name="form1" method="post" action="/Default.aspx" id="form1">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="has a value">
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="has a value">
<select name="ddlTest" id="ddlTest">
<option selected="selected" value="Hello">Hello</option>
<option value="World">World</option>
</select>
</form>
</body>
両方のスニペットの HTML コードを比較すると、後者のスニペットにはドロップダウン リストの「onchange」イベントと、ポストバックを行うための JavaScript 自体が欠落していることがわかります。私の web.config には、下位互換性のために次のものが含まれていますが、これも機能していないようです。
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
また、不足している Javascript をマークアップに追加しようとしましたが、うまくいきませんでした。また、コード ビハインドから onchange イベント + JavaScript を追加しようとしましたが、それも機能しませんでした
環境:
- Adobe AIR 3.2 ベースのブラウザー (ブラウザー コードへのアクセスなし)
- Windows 7 – 64 ビット マシン
- ビジュアルスタジオ 2010
- C#
この問題は大部分のブラウザーでは問題にならないことは承知していますが、作業プロジェクトの一部として、Adobe AIR 3.2 ベースのブラウザーで動作する必要があります。どんな助けでも大歓迎です、ありがとう!