1

非表示のフィールドを持つフォームがあります:

<form id="Form1" runat="server" style="width: 100%; height: 100%; overflow: hidden"       onsubmit="return false;">
<div>    
<input type="hidden" runat="server" id="TrackColors" value=""/>            
<input type="hidden" runat="server" id="Relogin" value=""/>
</div>
</form>

サーバー側の Page_Load() 関数が呼び出された後:

protected void SomeFunction()
    {
        Dictionary<int, int> trackColors = new Dictionary<int, int>();
        if (!String.IsNullOrEmpty(TrackColors.Value))
            trackColors = ReadValues(TrackColors.Value);

    //if value is null or empty it's assigned to a different


        TrackColors.Attributes["value"] = FormValues(trackColors); //FormValues() return string

    //change is visible        
    }


    string FormValues(Dictionary<int, int> values)
    {
    string result = "";
    if (values == null || values.Count == 0)
        return result;

    foreach (KeyValuePair<int, int> p in values)
        result += p.Key + "@@" + p.Value + "^^";
    result = result.TrimEnd('^');

    return result;
}

ComboBox の選択したフィールドを変更すると、関数が呼び出されます。

<dx:ASPxTextBox ID="ColorTrackCarID" Visible="false" Text='<%# Eval("CarId") %>' />
                    <dx:ASPxComboBox ID="ASPxComboBox1" runat="server" SelectedIndex='<%# Eval("TrackColor") %>' 
                                    ValueType="System.String" Width="30" ShowImageInEditBox="true" 
                        ondatabinding="ASPxComboBox1_DataBinding">
                                    <ClientSideEvents SelectedIndexChanged="function (s,e) { 
                                   if (window.TrackColorChanged != null)TrackColorChanged(s,e); }" />
</dx:ASPxComboBox>



function TrackColorChanged(s, e) {
            var TrackColors = document.getElementById('TrackColors');
            if (TrackColors == null || TrackColors.value == "")
                return values;      
            //values is always emply    
        }

フォーム フィールドの値がクライアント側に返されないことを理解しています。問題は、これらの値をどのように返すかです。

そして、Page_Load() でサーバー側の値を変更すると、クライアントはすべてを見ることができます。つまり、

protected void Page_Load(object sender, EventArgs e)
{
TrackColors.Attributes["value"] = "bla-bla-bla";
//All changes are visible on the client-side
}

ご清聴ありがとうございました。

4

1 に答える 1

3

さらに簡単にするために、隠しフィールドをコントロールに置き換えます。

<asp:HiddenField id="X" runat="server" />

値を直接設定できます:

X.Value = "XYZ";

この値は、クライアントからサーバーへ、またはその逆に渡すことができ、非常に簡単に機能します。サーバー側の入力を使用できないわけではありませんが、HiddenField がその多くを処理してくれます。

編集:また、値を上書きしていませんか? これを行っている場合:

protected void Page_Load(object sender, EventArgs e)
{
TrackColors.Attributes["value"] = "bla-bla-bla";
//All changes are visible on the client-side
}

これにより、値は常に「bla-bla-bla」に変更されます。if (!Page.IsPostback)ページの読み込み時に初期化する場合は、ラップする必要があります。

于 2013-02-13T14:10:31.360 に答える