为什么javascript indexOf()方法在从C#代码隐藏调用时抛出错误?

时间:2014-02-18 17:04:16

标签: c# javascript asp.net

我在项目中使用Google导航图表。

当我在客户端(.aspx页面)运行javascript代码时,一切正常,但当我把它放在后面的代码中并回显/写出来(通过Response.Write())时会抛出错误,特别是在javascript代码试图调用数组上的indexOf()方法时。

我试图检查错误的原因,但我得到的唯一信息是这是IE8中的一个问题,早期使用indexOf()方法 - 这不是我的问题,因为我说它工作正常当我直接从客户端调用它时 - 它只是从代码隐藏中产生问题。

这是我收到的具体错误:

0x800a01b6 - Microsoft JScript运行时错误:对象不支持属性或方法'indexOf'

这样可以正常工作(在客户端):

for (var i = 0; i < data.getNumberOfColumns() ; i++) {
if (i == 0 || defaultSeries.indexOf(i) > -1) {
// if the column is the domain column or in the default list, display the series
columns.push(i);
}
....

但这会抛出错误(在代码隐藏中):

htmlJS += "for (var i = 0; i < data.getNumberOfColumns() ; i++) {";
htmlJS += "if (i == 0 || defaultSeries.indexOf(i) > -1) {";
// if the column is the domain column or in the default li";st, display the series
htmlJS += "columns.push(i);";
htmlJS += "}";
....
Response.Write(htmlJS);

有谁知道为什么这个错误只发生在代码隐藏中?

3 个答案:

答案 0 :(得分:1)

假设defaultSeries是一个数组,需要为IE&lt; 9填充Array.prototype.indexOf,它只支持字符串上的indexOf。

这是polyfill from MDN

  if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement, fromIndex) {
      if ( this === undefined || this === null ) {
        throw new TypeError( '"this" is null or not defined' );
      }

      var length = this.length >>> 0; // Hack to convert object.length to a UInt32

      fromIndex = +fromIndex || 0;

      if (Math.abs(fromIndex) === Infinity) {
        fromIndex = 0;
      }

      if (fromIndex < 0) {
        fromIndex += length;
        if (fromIndex < 0) {
          fromIndex = 0;
        }
      }

      for (;fromIndex < length; fromIndex++) {
        if (this[fromIndex] === searchElement) {
          return fromIndex;
        }
      }

      return -1;
    };
  }

答案 1 :(得分:1)

两件事:

  1. 根据您的代码,您可能会遇到javascript的空白问题 - 您正在连接字符串,因此,例如,您将有一个看起来像“{if”的部分 - 但是,这不太可能导致您的问题。

  2. 可能导致您出现问题的是javascript点击页面的时间。当response.write被刷新到客户端时,对象是否存在?为了确保在需要时存在页面的所有必需位,通常需要使用脚本对象方法添加脚本,然后在加载页面后调用代码。查看此页面,将动态脚本动态添加到页面:http://msdn.microsoft.com/en-us/library/ms178207(v=vs.100).aspx

答案 2 :(得分:0)

谢谢大家 - 我找到了一个有效的解决方案:

如果我创建包含javascript indexOf()方法的相同字符串,然后将其作为输出分配给aspx页面上的文字元素,或者如果我通过&lt; %%&gt;“回显”它。特殊标签然后javascript代码将运行良好。

以下运行:

代码隐藏:

public string jsHtml ="";

jsHtml +="<script type='text/javascript'>";
jsHtml+="var defaultSeries = [1,2,3];";
jsHtml+="alert(defaultSeries.indexOf(2));";
jsHtml+="</script>";

txtValueA.Text = jsHtml;

Client / aspx页面:

<asp:Literal ID="txtValueA" runat="server></asp:Literal>
//OR
<%=jsHtml %>

奇怪但真实.....感谢输入