4

TagBuilder を使用して Javascript を作成するメソッドに C# 文字列配列を渡しています。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

4 に答える 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 ライブラリを使用せずに) 作成する場合は、無効、悪意のある、または予期しない出力を簡単に導入できるため、注意して行う必要があります。

于 2013-02-26T22:09:22.833 に答える
1

独自のソリューションを手作業で作成するのではなく、Newtonsoft.Jsonのようなライブラリを使用することをお勧めします。

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

なぜ車輪の再発明をするのですか?

于 2013-02-26T22:37:30.850 に答える
0
$.each('[' + string.Join(',', arrTickerContents), + ']', function (i, objValue) {
于 2013-02-26T21:50:06.020 に答える