0

ビューモデル構造をビューにプッシュして、JavaScriptで使用するのが好きです。これを行うためのよりエレガントな方法は何ですか?これらのコード行はちょっと醜いです。

<script type="text/javascript">
       var PartChangeModel = @Html.Raw(Json.Encode(Model.PartChange));
       var PartModel = @Html.Raw(Json.Encode(Model.Part));
       var BOMItemModel = @Html.Raw(Json.Encode(Model.BOMItem));
</script>
4

3 に答える 3

0

RazorマークアップとJavaScriptを混在させたくない場合は、AJAX呼び出しがおそらく最適です。jQueryを使用すると、シリアル化されたモデルを返すコントローラーエンドポイントにgetリクエストを発行できます。もちろん、このアプローチでは最初のページの読み込みに加えてサーバーへの追加のラウンドトリップが必要になるという主な注意点がありますが、それで私を止めることはできません。

クライアント側

$(function() {
    $.getJSON('part/get', function(data) {
      // do something with response
    });
}

サーバ側

public class PartChangeModel { }

public class PartModel { }

public class BOMItemModel { }

public class PartViewModel { }

public class PartController : Controller {
    public ActionResult Get() {
        var partChangeModel = new PartChangeModel { /* init properties via repo, etc. */ }
        var partModel = new PartModel { /* init properties via repo, etc. */ }
        var bomItemModel = new BOMItemModel { /* init properties via repo, etc. */ }

        var viewModel = new PartViewModel {
            PartChangeModel = partChangeModel,
            PartModel = partModel,
            BOMItemModel = bomItemModel
        }

        return Json(viewModel);
    }
}
于 2013-01-22T20:19:30.240 に答える
0

このためにいくつかのHTMLヘルパーを試してみてください。これはうまくいくようです。

 public static MvcHtmlString SerializeJsonForClient(this HtmlHelper helper, string JavascriptVariableName, object ObjectToSerialize)
        {
            return MvcHtmlString.Create(String.Format("var {0} = {1};", JavascriptVariableName, Json.Encode(ObjectToSerialize)));
        }

次に、次のようにRazorから呼び出すことができます。

<script type="text/javascript">
    @Html.SerializeJsonForClient("PartChangeModel", Model.PartChange)
    @Html.SerializeJsonForClient("PartModel", Model.Part)
    @Html.SerializeJsonForClient("BOMItemModel", Model.BOMItem)
</script>
于 2013-01-22T21:05:44.593 に答える
0

A-Dubbからの提案により、これを拡張メソッドに入れました。どちらの方法がより理にかなっていますか?おそらく6つ半ダースのようなものです。

 public static MvcHtmlString ToJson(this Object ObjectToSerialize, string JavascriptVariableName)
        {
            return MvcHtmlString.Create(String.Format("var {0} = {1};", JavascriptVariableName, Json.Encode(ObjectToSerialize)));
        }

次に、次のようにRazorから呼び出すことができます。

<script type="text/javascript">
    @Model.PartChange.ToJson("PartChangeModel")
    @Model.Part.ToJson("PartModel")
    @Model.BOMItem.ToJson("BOMItemModel")
</script>
于 2013-01-22T21:21:11.740 に答える