2012-09-03 89 views
0

好日子给大家,有什么方法可以替代Response.Write?

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

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

会议[“塔里夫”] - 包含多维数组列表,当我加载我的网页是给这个错误

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

当我删除<% 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', ''); 
     } 
    } 
} 

}

回答

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> 
+0

我试过,但它仍然给了同样的错误。 – firefalcon

+0

我刚刚编辑我的代码到我的问题。 – firefalcon

+0

你使用容器中的代码块<%%>来获取数组列表吗? – firefalcon

0

这是因为在你做你的页面代码的地方像(只是一个例子 - 这不重要,这是一个Label在这里,任何动态当你在同一个容器,你也尝试通过使用Controls集合容器(PagePanel等的动态添加控件有<%= ... %>

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

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

:盟友增加/删除的控制会引发错误) ),你会看到你看到的那个错误。

如果可以的话,尝试删除动态地将代码/删除控制容器(如你有<%= ... %>,然后在同一容器你<%= ... %>块将开始工作。

要删除的动态逻辑,增加/删除控制(S),干脆把这些控件到像任何其他控件容器,如

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

,然后简单地显示/隐藏控制,当你需要它。这样的控制始终是存在的该页面,您不需要在运行时添加/删除它,然后就可以了ve代码块放在同一个容器中。

这里有一个简单的例子,这将产生此错误:

... 
<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); 
} 
+0

但我没有通过我的代码添加任何控件。我只是在代码页中创建一个新的数组字符串,并试图在我的javascript函数中检索它。 – firefalcon

+0

@Shohin如果你尝试使用'Controls.Remove()',你会得到相同的错误。您无法以具有代码块的容器的任何方式更改'Controls'集合。 – xxbbcc

相关问题