3

この質問は似ていますが、結論がなく、「いいえ」という自己受容的な答えがあります。c#オブジェクトからjavascriptオブジェクトモデルを自動的に生成します。

Darinによるこの回答は、オブジェクトをJsonにマッピングする非常に良い例ですが、複雑なモデルで機能するかどうかはわかりません:https ://stackoverflow.com/a/9007578/1026459

これが私が見ていたものの例です。この設定を考えると:

ビューモデル:

public class Avm
{
 public int id { get; set; }
 public string name { get; set; }
 public Foo Foo { get; set; }
}

public class Foo
{
 public int id { get; set; }
 public string description { get; set; }
 public List<Bar> Bars { get; set; }
}

public class Bar
{
 public int id { get; set; }
 public string metal { get; set; }
}

このオブジェクトモデルを定義するための可能な方法はありますか

javascriptオブジェクトモデル:

<script>
 var Avm = {};
 Avm.id = @(Model.id);
 Avm.name = "@(Model.name)";
 Avm.Foo = {};
 Avm.Foo.id = @(Model.Foo.id);
 Avm.Foo.description = "@(Model.Foo.description)";
 Avm.Foo.Bars = [];
 var Bar = function(){
  return
  {
   id : var id,
   metal : var metal;
  };
 }
 var Bar0 = new Bar();
 Bar0.id = @(Model.Foo.Bars[0].id);
 Bar0.metal = "@(Model.Foo.Bars[0].metal)";
 Avm.Foo.Bars.push(Bar0);
 //and so on for each Bar.
</script>

手ですべてを入力するよりも正確な方法で?

または、おそらくヘルパーのある種の反省を通して、

<script>
 @Html.GenerateJsObjectModel(Model)
<script>

ヘルパーメソッドを呼び出す

    public static void GenerateJsObjectModel(
        this HtmlHelper html, dynamic model)
    {
      html.ViewContext.Writer.Write("var Avm = {};");
      html.ViewContext.Writer.Write("Avm.id = " + model.id + ");");
      //etc. (except obviously more generic instead of specific)
    }

これはフレームワークにすでに存在しますか?ここでは、JSONのようなシリアル化プロセスを使用する方が優れているでしょうか。その場合、このシナリオでJSONを結び付けるためにどのタイプのフックを使用しますか?

ビューモデルに基づいてJavaScriptで複雑なモデルを作成するためのベストプラクティスのアプローチは何ですか。

4

3 に答える 3

3

あなたが探していたのは、knockout.js ライブラリーのこのようなものでしょうか?

JSON オブジェクトの例:

var data = {"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

マッピング例

var viewModel = ko.mapping.fromJSON(data);    

ビューモデルを JSON サーバー側にシリアル化し、これを使用して JavaScript ビューモデルを自動生成できます。サーバーからデータを受信するたびに、その ko.mapping.fromJSON(data) 呼び出しを呼び出すだけで済みます。

ドキュメントへのリンク (非常に優れています): http://knockoutjs.com/documentation/plugins-mapping.html

これが役に立ったかどうか、またはあなたが望んでいたものであったかどうか教えてください。

編集: これは、Nuget を介してインストールすることですぐにデモできる、優れた JSON シリアル化ライブラリへのリンクです。 http://json.codeplex.com/

于 2012-07-03T21:15:02.353 に答える
2

私は JavaScriptSerializer の使用に部分的です。

Gist をここに投稿する方法がわからないので、関連するコードを含む Gist へのリンクを次に示します。

https://gist.github.com/3043237

インデックス.cshtml

@model JSSerializerSample.Models.IndexViewModel
@{
    ViewBag.Title = "Home Page";
}

<h2>@ViewBag.Message</h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<div id="userName"></div>
<div id="message"></div>
<div id="complexProperty1"></div>

<script>
    $(function () {
        var options = @Html.Raw(Model.AsJson());
        $("#userName").html(options.UserName);
        $("#message").html(options.Message);
        $("#complexProperty1").html(options.ComplexProperty.ComplexProperty1);
    });
</script>

ComplexViewModel.cs

namespace JSSerializerSample.Models
{
    public class ComplexViewModel
    {
        public string ComplexProperty1 { get; set; }
    }
}

IndexViewModel.cs

namespace JSSerializerSample.Models
{
    public class IndexViewModel : BaseViewModel
    {
        public string Message { get; set; }
        public string UserName { get; set; }

        public ComplexViewModel ComplexProperty { get; set; }
    }
}

BaseViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;

namespace JSSerializerSample.Models
{
    public abstract class BaseViewModel
    {
        public string AsJson()
        {
            var serializer = new JavaScriptSerializer();
            return serializer.Serialize(this);
        }
    }
}

完全なコード サンプルは、 https ://github.com/devlife/Sandbox/tree/master/JSSerializerSample からダウンロードできます。

于 2012-07-03T21:20:02.307 に答える
1

JSON を提供しようとしているようには聞こえません。これは、他の投稿への応答で純粋にデータ転送用として指摘されているように、JSONP を MVC3 で提供しようとしているように思えます。

MVC3 で JSONP を提供することはすぐに可能になります。

サーバー側部分のチュートリアル

クライアント側部分の CodePen の例

于 2012-07-03T21:15:01.590 に答える