0

別の asp:List ボックスの選択された値に基づいて、js から動的に入力される asp:ListBox があります。問題は、lstBox.selectedIndex = 0 を設定するか、実際にリスト内の項目を選択するかに関係なく、2 番目のリスト ボックスが常に "" の SelectedValue を返すことです。

.js をリストに追加し、デフォルトの選択項目を設定します

var Option = document.createElement("option");
lstId = document.getElementById(lstId);
Option.text = lstItem;
lstId.add(Option);    
lstId.selectedIndex = 0;

選択した値を取得する.vb

Dim selSchedule As String = lstCRMSched.SelectedValue

このリストは JavaScript によって入力されるため、@page EnableEventValidation = "false" を設定する必要がありました。そうしないと、後で来たポストバックが失敗します。

補足:非表示の div をメニュー選択に基づいて非表示にされたオーバーレイとして使用すると、asp.net がそれを好まないことに気付きました。これは、他の div の状態を一掃するポストバックが必要なためです。divごとに10個の.aspxファイルを用意し、セッションを使用してコードビハインドから場所を切り替えて、選択した値や別のdivに表示されるデータなどを転送する必要がありますか?

4

2 に答える 2

2

名前を持つフォーム内のすべての要素がリクエストで送信されるためSelectedValue、オブジェクトを介してドロップダウン リストにアクセスできます。Request

これを行うだけです:

Dim selSchedule As String = Request[lstCRMSched.UniqueID]

これで、ページで EventValidation を無効にしただけで機能します。あなたが得ていたエラーは完全に正常です。ASP.NET は、攻撃を防ぐために、最初にサーバーによってレンダリングされなかったデータを誰も送信しないようにしているだけです。ページで EventValidation を有効にしておく場合は、ClientScriptManager.RegisterForEventValidationを介して Validation 用のリストを登録する必要があります。

于 2012-08-31T19:56:54.857 に答える
1

クライアントのドロップダウンリストに項目を追加すると、これらの項目はサーバー上に永続化されません!

ただし、いくつかの非表示の入力フィールドに動的に追加された項目(テキストと値のペア)を保存して、サーバー上で解析することもできます。実際の例については、このリンクを参照してください。あなたの例では、selectedIndex別の非表示フィールドに保存して、サーバー上でアクセスできるようにする必要もあります。

編集

デモ.aspx

<script type="text/javascript">
function saveValue() {
    var hiddenField1 = document.getElementById("hiddenField1");
    hiddenField1.value = "hello world";
}
</script>
<form id="Form1" method="post" runat="server">
    <input type="hidden" id="hiddenField1" name="hiddenField1" value="" />
    <asp:Button ID="btnPostBack" runat="server" Text="PostBack" 
        OnClientClick="saveValue()" onclick="btnPostBack_Click" />
</form>

デモ.aspx.cs

protected void btnPostBack_Click(object sender, EventArgs e)
{
    Debug.WriteLine("Value of hiddenField1: " + Request["hiddenField1"]);
    Debugger.Break();
}

これは私のために働いた。"hello world"サーバーに入りました。

編集2

Icarus は、Request オブジェクトを参照することで、サーバーに送信された要素にいつでもアクセスできると指摘しました。もちろん、彼は絶対に正しいです。あなたの質問によると、動的に作成されたすべてのアイテムにアクセスしたいと思っていましたが、それは以下に示す解決策では不可能です。

aspxページ

<script type="text/javascript">
    function saveToList() {
        var ListBox1 = document.getElementById("ListBox1");
        var ListBox2 = document.getElementById("ListBox2");
        var Option = document.createElement("option");
        Option.text = ListBox1.options[ListBox1.selectedIndex].text;
        ListBox2.add(Option);
        ListBox2.selectedIndex = 0;
    }
</script>
<form id="Form1" method="post" runat="server">
<asp:ListBox ID="ListBox1" runat="server">
    <asp:ListItem Text="entry1" Value="1" />
    <asp:ListItem Text="entry2" Value="2" />
    <asp:ListItem Text="entry3" Value="3" />
    <asp:ListItem Text="entry4" Value="4" />
</asp:ListBox>
<asp:ListBox ID="ListBox2" runat="server" Width="100"></asp:ListBox>
<input id="Button1" type="button" value="Save to List" onclick="saveToList()" />

<asp:Button ID="btnPostBack" runat="server" Text="PostBack" OnClick="btnPostBack_Click" />

コードビハインド

protected void btnPostBack_Click(object sender, EventArgs e)
{
    Debug.WriteLine("SelectedValue of ListBox2: " + Request["ListBox2"]);
    // no access to all other clientSide created items in ListBox2
    Debugger.Break();
}
于 2012-08-31T19:33:26.850 に答える