0

我的问题是,我有以下功能:

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

Session["Tarif"] - 包含多维数组列表,当我加载我的页面时,它给出了这个错误

无法修改 Controls 集合,因为该控件包含代码块(即<% ... %>)。

当我删除<% Response.Write(Session["Tarif"]); %>它时,它不会给出这个错误。那么,如何在不使用代码块的情况下替换此代码以从 Session["Tarif"] 获取数组列表<% %>

这是我在 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

当您<%= ... %>在同一个容器中尝试通过使用Controls该容器的集合(PagePanel等)来动态添加控件时,您将看到您看到的错误。

如果可以,请尝试删除将控件动态添加/删除到容器的代码(您拥有的同一个容器,<%= ... %>然后您的<%= ... %>块将开始工作。

要删除添加/删除控件的动态逻辑,只需将这些控件像任何其他控件一样放入容器中,例如

<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 回答