每个人都过得愉快,
我的问题是,我有以下功能:
function change_tarif(param) {
var arrTarif = <% Response.Write(Session["Tarif"]); %>
.....
}
Session [“Tarif”] - 包含多维数组List,当我加载我的页面时,它给出了这个错误
无法修改Controls集合,因为该控件包含代码块(即&lt;%...%&gt;)。
当我删除<% 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', '');
}
}
}
}
答案 0 :(得分: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>
答案 1 :(得分:0)
这是因为你的页面代码中某处你做了类似的事情(只是一个例子 - 这里的Label
并不重要,任何动态添加/删除的控件都会触发错误):
Label lbl = new Label ();
lbl.Xxxx = ...;
Controls.Add ( lbl ); // this is what triggers your issue
当您在同一容器中有<%= ... %>
时,您还尝试通过使用该容器的Controls
集合(Page
,Panel
来动态添加控件,等等,你会得到你看到的那个错误。
如果可以,请尝试删除动态添加/删除控件的代码到容器(具有<%= ... %>
的同一容器,然后<%= ... %>
块将开始工作。
要删除添加/删除控件的动态逻辑,只需将这些控件放入容器中,就像任何其他控件一样,如
<asp:Label runat="server" id="lbl" ... />
然后只需在需要时显示/隐藏控件。这样控件始终存在于页面中,您不必在运行时添加/删除它,然后您可以在同一个容器中放置代码块。
以下是一个会产生此错误的简单示例:
...
<div runat="server" id="div1">
<asp:Label runat="server" id="lbl1" /><br />
<span>Name: <%= 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 );
}