将C#字符串数组转换为Javascript数组

4

我正在将一个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;
        });

这要怎么做才是正确的语法?
4个回答

3
问题在于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库)时应该小心谨慎,因为很容易引入无效、恶意或其他意外的输出。


1

1
我用 NewtonSoftRazor 中做到了这一点。
var jsonArray=Newtonsoft.Json.JsonConvert.SerializeObject(arrTickerContents);
var rss_scr_contents = @Html.Raw(jsonArray);

0
$.each('[' + string.Join(',', arrTickerContents), + ']', function (i, objValue) {

-1 是因为虽然这可能有效,但它实际上并不比在 SQL 中不使用占位符更好。无法保证此手动转换为 JS 数组将生成有效的字面量,并且输入甚至没有像 int[] 一样受限制,因此它可能会在给定输入的许多(也许是大多数)值中出现问题。我建议只使用“to JSON”。 - user166390
首先,我假设你的意思是 $.each('[' + string.Join(',', arrTickerContents) + @']', function (i, objValue) {。但是即使你这么做了,如果你的输入数组是 ["one", "two", "three"],那么结果将会是 $.each('['"one, two, three"']', function (i, objValue) {,对吗? - Scott Mermelstein
@ScottMermelstein,不会吧,为什么会呢?! - gdoron
你当前在C#的一个@字符串中,所以'是字符串的一部分。对于数组使用string.Join会添加逗号,但不会将其变成三个不同的字符串。而且按照你现有的解决方案,arrTickerContnets)后面的逗号应该导致编译错误。 - Scott Mermelstein
抱歉,我应该撤回我放置的双引号。如果你的行是$.each('[' + string.Join(',', arrTickerContents) + @']', function (i, objValue) {,我相信它会产生$.each('['one, two, three']', function (i, objValue) {。我认为在定义JavaScript数组时,每个字符串都需要有''或""。 - Scott Mermelstein
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接