4

まず、このコードは機能しますが、私が取り除きたいと思うほどの煩わしさはありません。カミソリ構文を使用して作成された .cshtml ページがあります。ページ上の多くのものがバインドされている舞台裏には、大きくて厄介なノックアウト オブジェクトが存在します。現在、そのノックアウト モデルをインスタンス化するときは、問題の C# ビューモデル オブジェクトを以下のような文字列リテラル内でシリアル化することによって行っています。

<script type="text/javascript">
        $(document).ready(function() {
            var data = @Html.Raw(Json.Encode(Model));
            var contentListingModel = new ContentListingModel(data);
            ko.applyBindings(contentListingModel, $('#pageRoot').get(0));
        });
</script>

私が言ったように、コードは機能します。ただし、@Html.Raw 呼び出しの行で、警告が表示されます。Visual Studio は、そこに構文エラーがあると認識しています (レンダリングされた後ではありません)。さて、構文の問題があると信じている理由は完全に理にかなっています。しかし、この問題を引き起こさない方法でコーディングすることで警告を取り除きたいと思っています (警告を非表示にするか、他の多くのことを実行できることを認識しています)。 C# オブジェクトを JSON にシリアル化し、それらをページ上の JavaScript に詰め込んでいます。何か案は?

コードは完全に機能し、一見きれいに見えるので、これについて尋ねるのは衒学的でささいなことであることを完全に受け入れますが、それは私を悩ませます。

4

3 に答える 3

1

IDE は、純粋に Razor で構成される行を受け入れるほどスマートなので、次のように記述できます。

@Html.Raw( "var data= " + Json.Encode(Model) + ";" )
alert(data);

(想定される) 暗黙のグローバルが気になる場合 (Resharper 警告をトリガーするなど)、宣言と代入を分割してください。

var data; // javascript
@Html.Raw( "data= " + Json.Encode(Model) + ";" ) // all razor

実行時に生成されるもの:

var data;
data = {"foo": "bar"};
于 2013-10-03T03:15:26.703 に答える
0

'ActionMethod でモデルを Json にシリアル化し、ViewData または ViewBag を介してビューに渡し、Html.Raw を使用して ViewModel に渡すだけです。次のようなものです。

//あなたのActionMethodで

var serializer = new JavaScriptSerializer();

Viewdata["SomeName"] = serializer.Serialize(モデル);

//あなたのcshtmlで

@{

string data = (string)Viewdata["SomeName"];

}

$(document).ready(function() {

        var contentListingModel = new ContentListingModel('@Html.Raw(data)');
        ko.applyBindings(contentListingModel, $('#pageRoot').get(0));

    });
于 2013-09-02T19:13:05.990 に答える