Javascript if语句失败

时间:2015-07-16 15:01:09

标签: javascript c# code-injection

我不完全确定为什么会这样。我想要做的是将一个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位没有任何内容。

知道为什么代码会像这样执行吗?

4 个答案:

答案 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 %>)