1

シリアル化されたデータをビューに送信し、それをノックアウトコードにバインドしようとしています。列挙型の定数をビューに渡したいので(基になる整数ではなく)、シリアル化にjson.netライブラリを使用しています。コントローラーがJsonデータを返す方法がわかりません。サンプルコードは次のとおりです。

シリアル化される私のビューモデル:

public class FranchiseInfoViewModel
    {

        public string FolderName { get; set; }

        [JsonConverter(typeof(StringEnumConverter))]
        public LobbyTemplateOptions LobbyTemplate { get; set; }

        public List<LobbyTemplateOptions> LobbyTemplates { get; set; }

        public void Initialize()
        {
            FolderName = "Test";

            LobbyTemplate = LobbyTemplateOptions.G;
            LobbyTemplates = new List<LobbyTemplateOptions>
                                 {
                                     LobbyTemplateOptions.G,
                                     LobbyTemplateOptions.H,
                                     LobbyTemplateOptions.I
                                 };

列挙型:

[JsonConverter(typeof(StringEnumConverter))]
    public enum LobbyTemplateOptions
    {
        G = 7,
        H = 8,
        I = 9
    }

私のノックアウトコード:

$(function () {
    omega.FranchiseInfo = (function () {
        var FolderName = ko.observable();
        var LobbyTemplates = ko.observableArray([]);

        $.getJSON("FranchiseData", function (data) {
            FolderName(data.FolderName);

            for (var i = 0; i < data.LobbyTemplate.length; i++) {
               LobbyTemplates.push(data.LobbyTemplate[i]);
            }
        });

        return {
            folderName: FolderName,

            lobbyTemplates: LobbyTemplates
        }
    } ());
    ko.applyBindings(omega.FranchiseInfo);
})

        }

シリアル化されたJsonデータをビューに渡すコントローラーは、json.netを使用したことがなく、プログラミングに比較的慣れていないため、どのように表示されるのでしょうか。

Jsonデータをビューに渡すコントローラー:

 public JsonResult FranchiseData()
            {
                FranchiseInfoViewModel franchiseInfoViewModel = new FranchiseInfoViewModel();
                franchiseInfoViewModel.MapFranchiseInfoToFranchiseInfoViewModel();
                string json = JsonConvert.SerializeObject(franchiseInfoViewModel);

                // this is how I do it with the default Json serializer
               // return Json(franchiseInfoViewModel, JsonRequestBehavior.AllowGet);
            }

誰かが私のコントローラーの実用的な例を投稿できれば、私は非常に感謝しています。ありがとう!

4

1 に答える 1

-1

JsonNetResultを実装する必要があります。

public class JsonNetResult : ActionResult
{
  public Encoding ContentEncoding { get; set; }
  public string ContentType { get; set; }
  public object Data { get; set; }

  public JsonSerializerSettings SerializerSettings { get; set; }
  public Formatting Formatting { get; set; }

  public JsonNetResult()
  {
    SerializerSettings = new JsonSerializerSettings();
  }

  public override void ExecuteResult(ControllerContext context)
  {
    if (context == null)
      throw new ArgumentNullException("context");

    HttpResponseBase response = context.HttpContext.Response;

    response.ContentType = !string.IsNullOrEmpty(ContentType)
      ? ContentType
      : "application/json";

    if (ContentEncoding != null)
      response.ContentEncoding = ContentEncoding;

    if (Data != null)
    {
      JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting };

      JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
      serializer.Serialize(writer, Data);

      writer.Flush();
    }
  }
}

これを使用するには、次のようにコントローラーメソッドを書き直す必要があります。

public ActionResult FranchiseData()
{
    FranchiseInfoViewModel franchiseInfoViewModel = new FranchiseInfoViewModel();
    franchiseInfoViewModel.MapFranchiseInfoToFranchiseInfoViewModel();

    JsonNetResult jsonNetResult = new JsonNetResult();
    jsonNetResult.Formatting = Formatting.Indented;
    jsonNetResult.Data = franchiseInfoViewModel;

    return jsonNetResult;
}

(上記のJsonNetResultの実装は、このブログ投稿 http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspxで行われました)

于 2012-04-12T23:38:31.330 に答える