9

<asp:DropDown>私は2つのコントロールを持つWebページを持っています:

ここに画像の説明を入力

ユーザーがを選択すると、州のリストを埋めたいと思います。


試行 #1 - OnSelectedIndexChanged

最初のことは非常に簡単でした:OnSelectedIndexChanged最初のドロップダウン中に、2 番目のボックスに入力します。

//be sure to set AutoPostBack of cbCountry to true in the properties window

protected void cbCountry_SelectedIndexChanged(object sender, EventArgs e)
{
   cbState.Items.Clear();
   FetchStatesForCountryIntoStateDropDown(cbState, cbCountry.SelectedValue);
   if (cbState.Items.Count > 0)
      cbState.SelectedIndex = 0;
}    

ページの更新をトリガーすることを除いて、これは十分に機能しました。投稿の送信中にユーザーが中断され、ページがリロードされます。そして、そのページはもはや彼らが残した場所ではなく、ドロップダウン内に座っていません.


試行 #2 - 昔ながらの kludgey UpdatePanels

@Seglo は UpdatePanels を昔ながらの kludge と呼んでいます。しかし、私はそれ以上のものを見つけることができないので、試してみましょう! それらを更新パネルにラップし、それを魔法のようにします:

ここに画像の説明を入力

問題は、UpdatePanel更新時に両方のコントロールが削除され、新しいコントロールに置き換えられることです。これは、ユーザーが最初のドロップダウンでフォーカスを失ったことを意味します。人々は、javascript を使用してフォーカスを保存および復元しようとする恐ろしいクラッジを提案しています。しかし、私はむしろ物事を正しく行いたいです。


試行 #3 - 更新する必要がある UpdatePanel のみ

ドロップダウン (およびラベル)を更新する必要はありません。Stateドロップダウンを更新するだけです。では、それだけを でラップしてみませんか。実際、これは StackOverflow で提案されている答えです:<asp:UpdatePanel>

ここに画像の説明を入力

そして、それは機能します。ドロップダウンはフォーカスを失いません。OnSelectedIndexChangedイベントが発生し、Stateドロップダウンが満たされます...

...国ドロップダウンを初めて変更します。

を再度変更すると、例外がスローされます。

ポストバックまたはコールバック引数が無効です。

どういうわけか、updatepanelが WebForms コントロールをいじっています。ポストバック データを無効にします。WebForms コントロールをいじるとポストバック データが無効になるため、これは理にかなっています。


試行 #4 - JavaScript を使用して自分でポストバックを偽造してみてください

それはあなたに何の利益ももたらしません。しかし、人々は javascript を介して手動でポストバックをトリガーしようとしました:

$('#userControl1').on('focusout', function() {
     __doPostback('UpdatePanel2UniqueId', '');
});

とを知らない場合ClientIDを除いて、スクリプトは実行されません。それが私の問題を解決できるかどうかさえわかりませんcbCountryUpdatePanel1


試行 #5 - PageMethodsState リストを取得するために使用します。

今、私は他の人のランダムな提案をリンクしているだけです. 提案を実行しようとすると、約 4 時間かかります。つまり、コンボ ボックスを埋めるのに 1 日半を費やしたことになります。

Google で見つけたすべてのランダムな提案で 1 日を失うわけにはいきません。私は実際の答えが必要です。だから、不機嫌そうな人々に研究努力があったことを示すためにそれらを含めているだけです(研究努力が重要であるかのように).

一部の人々は、 ASP.net を呼び出すことを提案し、クライアントの javascriptPageMethodsを更新cbStateします。

function GetStates(country)
{
    PageMethods.GetTeam(teamCode, CountryCallback);
}

function CountryCallback(result)
{
    var teamName = $get('TeamName');
    var seed = $get('Seed');
    var rpi = $get('RPI');
    var scoutingReport = $get('ScoutingReport');
    teamName.innerText = result.TeamName;
    seed.innerText = result.Seed;
    rpi.innerText = result.RPI;
    scoutingReport.innerText = result.ScoutingReport;
}

onchange="GetTeam(this.options[this.selectedIndex].value);"

ここでの問題は Attempt#2 と同じです。ASP.net の背後にあるフォームをいじったので、viewstate は間違っています。


ASP.net とviewstateがクライアント側の DOM 更新と根本的に互換性がないという根本的な問題があるようです。クライアント側でページを変更しようとすると、ASP.net Web フォーム プログラミング モデル全体が無効になります。

4

5 に答える 5

1

AJAX Control Toolkit を使用してください...完璧な CascadingDropDown があります! :)

http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx

于 2013-04-12T15:59:10.430 に答える
0

javascriptを使用してコントロールを更新してもDropDownList、ビューステートは変更されません。つまり、各投稿で変更が上書きされます。

隠しフィールドのリストのコンテンツをJSONにシリアル化してから、サーバーコードで各投稿で逆シリアル化するのと同じようなことをしました。

これは、似たようなものを示すための完全な実例を示す回答です(受け入れられた回答を確認してください)。

ASP.NETjQueryダブルリストボックスの編集と保存

編集1

ところで、取り除くために:

無効なポストバックまたはコールバック引数。

ビューステート検証を無効にすることはできますが、これはお勧めしません。ほとんどの場合ユーザーを信頼できるイントラネットを使用している場合にのみ無効にする必要があります。

<%@ Page EnableEventValidation="false"
于 2012-06-28T20:52:16.203 に答える
0

ページ位置の問題を解決する試み#1に関連して、aspxページヘッダーでこれを使用して試すことができます

<%@ Page MaintainScrollPositionOnPostback="true" %>

メソッドにjavascriptを登録してcbCountry_SelectedIndexChanged、状態コンボボックスにフォーカスを設定します。

于 2013-04-12T13:57:16.903 に答える
0

私にはトリックがあり、それは機能します。Stateドロップダウンと同じ更新ペイン内の非表示のボタンを使用しています。

<script type="text/javascript">
    function ddlCountry_changed() {
        document.getElementById('<%= btnLoad.ClientID %>').click();
    }
</script>

Country:
<asp:DropDownList ID="ddlCountry" runat="server" onchange="ddlCountry_changed();">
    <asp:ListItem Text="Vietnam" Value="1"></asp:ListItem>
    <asp:ListItem Text="United State" Value="2"></asp:ListItem>
</asp:DropDownList>

<asp:UpdatePanel ID="updatePanel" runat="server">
    <ContentTemplate>
        <asp:Button ID="btnLoad" style="display: none" runat="server" OnClick="btnLoad_OnClick" />
        State:
        <asp:DropDownList ID="ddlState" runat="server">
        </asp:DropDownList>
    </ContentTemplate>
</asp:UpdatePanel>

コードビハインド:

    protected void btnLoad_OnClick(object sender, EventArgs e)
    {
        ddlState.Items.Clear();

        if (ddlCountry.SelectedValue == "2")
        {
            ddlState.Items.Add(new ListItem() { Text = "California", Value = "1" });
        }
        else
        {
            ddlState.Items.Add(new ListItem() { Text = "Saigon", Value = "2" });
        }
    }
于 2013-01-03T17:28:36.873 に答える
-2

dropdownList の設定に移動します

AutoPostBack=True を設定し、

于 2012-12-14T14:24:22.857 に答える