2012-09-03 162 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

相關問題