【问题标题】:Converting a C# string array into a Javascript array将 C# 字符串数组转换为 Javascript 数组
【发布时间】:2013-02-12 13:05:26
【问题描述】:

我将 C# 字符串数组传递给使用 TagBuilder 构建一些 Javascript 的方法。我似乎无法在我的 Javascript 中获取数组中的实际项目:

public static IHtmlString NewsTicker(this HtmlHelper htmlHelper, string[] arrTickerContents)
    {
        TagBuilder script = new TagBuilder("script");
        script.Attributes.Add("type", "text/javascript");

        script.InnerHtml = @"

            var rss_scr_contents = new Array();

            $.each('" + arrTickerContents + @"', function (i, objValue) {
                rss_scr_contents[i] = objValue;
        });

        return MvcHtmlString.Create(script.ToString());
    }

这会产生以下源代码:

var rss_scr_contents = new Array();

            $.each('System.String[]', function (i, objValue) {
                rss_scr_contents[i] = objValue;
        });

执行此操作的正确语法是什么?

【问题讨论】:

    标签: c# javascript jquery


    【解决方案1】:

    问题是arrTickerCountents.ToString() 没有返回预期的结果。

    例如,(new [] {"hello", "world"}).ToString() 的计算结果为 "System.String[]",这在这里没有用处。

    处理此问题的有效方法是使用转换,而不是从合适的 .NET 对象发出有效的 JavaScript 值 - 最常见的工具可能是 JSON 转换器。我喜欢Json.NET,但这应该适用于其他转换器。

    var jsonArray = JsonConvert.SerializeObject(arrTickerContents);
    script.InnerHtml = @"
            var rss_scr_contents = [];
            $.each(" + jsonArray + @", function (i, objValue) {
                rss_scr_contents[i] = objValue;
            })
    "; // Please make sure to post valid code
    

    由于上述循环没有按原样进行处理,因此请考虑更简单的替代方案。 (我不喜欢将var 与全局窗口属性一起使用。)

    script.InnerHtml = @"rss_scr_contents = " + jsonArray + ";";
    

    我推荐 JSON 的简单性和可用的自动转换,尽管它可能并不总是适用。手动构建 JavaScript 值(即没有 JSON 库)应该小心,因为很容易引入无效、恶意或其他意外输出。

    【讨论】:

      【解决方案2】:

      我建议您使用像 Newtonsoft.Json 这样的库,而不是手动滚动您自己的解决方案。

      http://james.newtonking.com/pages/json-net.aspx

      为什么要重新发明轮子?

      【讨论】:

        【解决方案3】:

        我在Razor 中使用NewtonSoft 这样做。

        var jsonArray=Newtonsoft.Json.JsonConvert.SerializeObject(arrTickerContents);
        var rss_scr_contents = @Html.Raw(jsonArray);
        

        【讨论】:

          【解决方案4】:
          $.each('[' + string.Join(',', arrTickerContents), + ']', function (i, objValue) {
          

          【讨论】:

          • -1 因为虽然这 可能 有效,但实际上并不比在 SQL 中不使用占位符好。无法保证本手册 to-JS-array 将产生有效的文字,并且输入甚至不像 int[] 那样受到限制,因此它可能会因 many (也许是大多数)值而中断在给定的输入中。我建议只使用“to JSON”。
          • @pst,嗯......这是被问到的,这是被回答的,当然,你可以投反对票,虽然这很奇怪......
          • 重新阅读我的评论。以下是此代码可能生成的一些无效输出:[1,hello world!,alert("\o/")]].
          • 首先,我假设您的意思是$.each('[' + string.Join(',', arrTickerContents) + @']', function (i, objValue) {。但即使你这样做了,假设你的输入数组是 ["one", "two", "three"],这将导致 $.each('['"one, two, three"']', function (i, objValue) {,不是吗?
          • @ScottMermelstein,不,为什么会这样?!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-03
          • 1970-01-01
          • 2016-11-20
          • 2020-12-23
          • 1970-01-01
          • 2022-01-23
          相关资源
          最近更新 更多