0

私の問題は、次の機能があることです。

function change_tarif(param) {
    var arrTarif = <% Response.Write(Session["Tarif"]); %>
    .....
}

Session["Tarif"] - 多次元配列 List が含まれており、ページを読み込んでいるときに、このエラーが発生しています

コントロールにコード ブロック (つまり ) が含まれているため、Controls コレクションを変更できません<% ... %>

削除する<% Response.Write(Session["Tarif"]); %>と、このエラーは発生しません。では、コード ブロックを使用せずに、このコードを置き換えて、Session["Tarif"] から配列 List を取得するにはどうすればよい<% %>でしょうか。

これは、C# の配列リスト コードです。

    public void getTarifList()
{
    int intRows = 0;
    string strTarif = "null";
    Session["Tarif"] = "null";

    SqlCommand cmdTarif = new SqlCommand("sp_SIMPay_GetTarifList");
    cmdTarif.CommandType = CommandType.StoredProcedure;

    DataTable dtTarif = SQL.GetData(cmdTarif);

    if (dtTarif.Rows.Count > 0)
    {
        intRows = dtTarif.Rows.Count;

        strTarif = "new Array(" + intRows + ");";
        int intIndex = 0;

        foreach (DataRow dRows in dtTarif.Rows)
        {
            strTarif += "arrTarif[" + intIndex + "] = new Array('" + dRows["TarifName"] + "', '" + dRows["ProviderID"] + "', '" + dRows["CodeID"] + "');";
            intIndex++;
        }
    }
    else
    {
        strTarif = "null";
    }
    Session["Tarif"] = strTarif;
}

私の完全なスクリプト:

function change_tarif(param) {
var  arrTarif = <% Response.Write(Session["Tarif"]); %>
var select = document.getElementById('TarifList');


var i = 0;

if (arrTarif != null) {
    for (i = 0; i < arrTarif.length; i++) {
        if (arrTarif[i][1] == '98' && param == '98') {
            clear_tarif();
            select.options[select.options.length] = new Option('' + arrTarif[i][0] + '', '' + arrTarif[i][2] + '');
            break;
        }
        else {
            clear_tarif();
            select.options[select.options.length] = new Option('Default Tarif', '');
        }
    }
}
}
4

2 に答える 2

0

Expression(と同等)を使用できますResponse.Write()

function change_tarif(param) {
 var arrTarif = <%= Session["Tarif"] %>;
}

編集:私はあなたのコードをカスタマイズしました、

コードビハインド:

protected void Page_Load(object sender, EventArgs e)
{
    getTarifList();
}
public void getTarifList()
{
    Session["Tarif"] = "null";
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("new Array(" + 3 + ");");
    for(int i=0;i<3;i++)
    {
        sb.AppendLine("arrTarif[" + i + "] = new Array('A" + i + "', 'B" + i + "', 'C" + i + "');");
    }
    Session["Tarif"] = sb.ToString();
}

そしてマークアップ、

 <script type="text/javascript">
    function change_tarif(param){
       var  arrTarif = <% Response.Write(Session["Tarif"]); %>
       return arrTarif;
      }
     console.log(change_tarif('test'));
 </script>
于 2012-09-03T01:57:53.110 に答える
0

これは、ページ コードのどこかで次のようなことを行うために発生します (ほんの一例です。Labelここにあることは重要ではありません。動的に追加/削除されたコントロールはエラーをトリガーします)。

Label lbl = new Label ();
lbl.Xxxx = ...;

Controls.Add ( lbl ); // this is what triggers your issue

そのコンテナーのコレクション ( 、など)<%= ... %>を使用してコントロールを動的に追加しようとする同じコンテナー内にある場合、見たエラーが発生します。ControlsPagePanel

可能であれば、コンテナーにコントロールを動的に追加/削除するコードを削除してみてください (同じコンテナーを使用する<%= ... %>と、<%= ... %>ブロックが機能し始めます。

コントロールを追加/削除する動的ロジックを削除するには、他のコントロールと同様に、これらのコントロールをコンテナに配置するだけです。

<asp:Label runat="server" id="lbl" ... />

必要なときにコントロールを表示/非表示にするだけです。このようにして、コントロールは常にページに存在し、実行時にコントロールを追加/削除する必要がなくなり、同じコンテナーにコード ブロックを含めることができます。

このエラーを作成する簡単な例を次に示します。

...
<div runat="server" id="div1">
    <asp:Label runat="server" id="lbl1" /><br />
    <span>Name:&nbsp;<%= Session["name"] %></span>
</div>
...

// in code-behind
protected override void OnLoad ( EventArgs e )
{
    Label lbl2 = new Label ();
    lbl2.Text = "Time: " + DateTime.Now.ToString ();

    // Error: you cannot modify the Controls collection if
    // the same control contains code blocks
    div1.Controls.Add ( lbl2 );
}
于 2012-09-03T02:17:10.617 に答える