我不完全确定为什么会这样。我想要做的是将一个C#变量注入到javascript if语句中,但它没有执行我想要的方式,我不知道为什么。
我的C#名称空间中有一个列表
C#list:
List<string> unitNamesMainChart = new List<string>();
在加载时,这个列表中没有任何内容,所以我想确保我没有访问列表,因为这会抛出错误,所以我在javascript中有一个if语句。
的Javascript
if(<%=unitNamesMainChart.Count %> >= 1 ){
a = <%= unitNamesMainChart[0] %>
}else{
a = ''
}
if(<%=unitNamesMainChart.Count %> >= 2)
{
b = <%= unitNamesMainChart[1] %>
}else{
ba = ''
}
//etc. There are numerous if statements.
理想情况下,我想检查列表中是否有任何内容,如果有,请在javascript中将其设置为变量a
,如果列表中没有任何内容,则设置a=''
实际发生的是,当代码执行时,它会在a = <%= unitNameMainChart[0] %>
崩溃,因为第0位没有任何内容。
知道为什么代码会像这样执行吗?
答案 0 :(得分:2)
这一行:
if(<%=unitNamesMainChart.Count %> >= 1 ){
在javascript中转换为此行:
if(0 >= 1){
其中0可以是任何数字,任何可能是实际零。
这一行:
a = <%= unitNamesMainChart[0] %>
转换为:
a = --Something--
其中--Something--
被认为是数组的第一个值。
您正在错误地混合使用JavaScript和.net代码。
你正在寻找这样的东西:
<%if(unitNamesMainChart.Count >= 1){%>
a = <%= unitNamesMainChart[0] %>;
<%}
else
{%>
a = -1; // or something
<%}%>
您将在页面上看到的JavaScript将是:
a = -- Something --
if \ else是.net代码,而输出(a = -- Something --
)是JavaScript。
答案 1 :(得分:1)
问题在于,您在使用C#检查的内容与您在JavaScript中检查的内容之间存在不匹配。正如目前所写,您的if
语句在浏览器上用JavaScript检查,但无论列表有多大,unitNamesMainChart[0]
都会被C#评估。
我建议将所有逻辑移到C#中,不让任何if/else
分支离开JavaScript:
a = <%=((unitNamesMainChart.Count >= 1) ? unitNamesMainChart[0] : "''")%>;
或者,更简洁:
a = <%=unitNamesMainChart.FirstOrDefault() ?? "''"%>;
答案 2 :(得分:1)
您正在混合服务器端和客户端执行的代码,了解所有内容的执行位置和时间非常重要。
在服务器端,我们只是生成文本,Javascript构造没有意义,并且if
未被评估。它只是文字。这意味着<%= unitNamesMainChart[0] %>
将在所有情况下执行,因为它不受服务器端测试的保护(当然,如果列表为空,它会给你一个例外)。
您可以像这样重写代码以避免此问题:
<% if (unitNamesMainChart.Count > 0) {%>
a = '<%= unitNamesMainChart[0] %>'
<% } else {%>
a = ''
<% } %>
这一次,测试在服务器端执行,如果列表为空,你不会尝试获取第一个元素。
答案 3 :(得分:-2)
问题是javascript可能会将.Count函数呈现为字符串而不是整数。尝试使用包含.Count语句的以下内容来确保它是一个数字。
parseInt(<%=unitNamesMainChart.Count %>)