3

ASP.NET MVC 4 アプリがあります。このアプリには、フッターに JavaScript のブロックを含むビューがあります。RAZOR ビュー エンジンを使用しています。結果セットを JSON 配列に変換する方法を見つけようとしています。現在、私は次のことを行っています。

<script type="text/javascript">
@for (int i=0; i<ViewBag.States.Count; i++) {
    <text>
        { id: @Html.Raw(ViewBag.States[i]["ID"], name: \"" + ViewBag.States[i]["Name"] + "\"}")
    </text>
    if (i < (ViewBag.States.Count - 1)) {
        <text>,</text>
    }
}
</script>

このアプローチは、構文的にずさんなようです。ただし、他に方法がわかりません。これをきれいにする方法を知っている人はいますか?このアプローチでは、「ID」値を引用符で囲む方法さえわかりません。

4

4 に答える 4

6

私は質問が1年以上前にすでに回答されていることを知っていますが、私の解決策を追加したかったのですが、これは最もクリーンです。

私が基本的にやったことはこれです(Newtonsofts Json.Netを使用)。次のような HtmlHelper クラスの拡張メソッドを作成しました。

public static class HtmlHelperExtensions
{
    public static HtmlString ToJson(this HtmlHelper @this, object value)
    {
        return new HtmlString(JsonConvert.SerializeObject(value));
    }

    public static HtmlString ToJson(this HtmlHelper @this, object value, Formatting formatting)
    {
        return new HtmlString(JsonConvert.SerializeObject(value, formatting));
    }
}

これにより、次のことが可能になりました。

$scope.test = @(Html.ToJson(new []
                    {
                        new {id='1',name="Hello", desc="World"},
                        new {id='1',name="Hello", desc="World"},
                        new {id='1',name="Hello", desc="World"}
                    }));

結果は次のようになります。

$scope.test = [{"id":"1","name":"Hello","desc":"World"},{"id":"1","name":"Hello","desc":"World"},{"id":"1","name":"Hello","desc":"World"}];

基本的にあなたの例は次のようになります:

@(Html.ToJson(ViewBag.States.Select(s=>new {id=s["ID"], name=s["Name"]})))

また

@(Html.ToJson(
    from state in ViewBag.States
    select new {id=state["ID"], name=state["Name"]}))
于 2014-10-15T11:23:24.123 に答える
2

JavaScriptSerializerクラスを使用して、コレクションを JSON にシリアル化できます。

@{
   var serializer = new JavaScriptSerializer();
   var serializedData = serializer.Serialize(Enumerable.Select(ViewBag.States, state =>
                                                      new {
                                                            id = state["ID"],
                                                            name = state["Name"]
                                                           }));

}

シリアル化されたデータは、次の方法でレンダリングできます。

@Html.Raw(serializedData)

そして、次のように JavaScript の使用法を解析できます。

JSON.parse('@Html.Raw(serializedData)');

あなたの例にはある種の構文上の誤りがあると思います.Html.Raw()メソッド呼び出しを何に使用するつもりなのか理解できませんでしたが、コードを少し変更してメソッド呼び出しをどこにでも挿入できます必要です。

于 2013-03-07T21:21:03.567 に答える
1

Razor は xml ベースの言語をより適切に処理しますが、正確さのために、これは実際に可能です。

私はあなたがこのようにしたかったと思います:

@model IEnumerable<Your.Actual.Namespace.State>
[
@for (int i=0; i < Model.Count; i++) {
    var item = Model[i];
    <text>{ id: @Html.Raw(item["ID"]), name: '@Html.Raw(item["Name"])' }</text>
    if (i < (Model.Count - 1)) 
    {
        <text>,</text>
    }
}
]

ビューを呼び出すときは、次のように記述します。

return View(states);

「状態」は、以前に ViewBag に入れた「状態」オブジェクトの配列である必要があります。この方法でモデルとして追加すると、モデルとして .cshtml で使用できます (私のコードで確認できます)。

また、コードを少しクリーンアップしました。

この方法をお勧めするわけではありませんが、これには、コントローラー内のオブジェクトから json シリアライザーを使用して行う場合よりも大きな利点が 1 つあります。それは、コードを再構築して運用サーバーに再公開することなく、シリアル化を変更できることです。

したがって、全体的にコードは非常に醜いものになります。これについては何もできませんが、cshtml を編集するだけでライブ アプリケーションで変更できます。

私なら 100 回に 1 回の割合でこれを行いますが、この種の柔軟性が重要になる場合もあります。あなたの場合ではありません。JSONに事前定義された形式がある場合、NicoやRickardが提案したように、実際にはある種のjsonシリアライザーを使用する必要があります。

于 2013-03-07T21:22:26.170 に答える
0

Ajax 経由でロードしたくない場合は、コントローラーでモデルを作成し、それを文字列にシリアル化し、それを @Model 自体または ViewBag で公開することをお勧めします。

1 つの方法はJsonObjectJSON.NETまたはServiceStack.Textで使用し、そのシリアライザーを使用して文字列を取得することです。

于 2013-03-07T21:05:09.367 に答える