2012-03-30 16 views
1

JavaScriptとMVC 3の新機能です。サンプルアプリケーションを開発して、KnockoutJsを理解しています。 いくつかのプロパティを持つc#オブジェクトをコントローラに渡しています。このオブジェクトはJSonとして直列化されたViewに渡されます。それから私は私のビューでノックアウトとデータを使用して、このデータをサーバーに戻したいと思います。しかし、サーバーデータとのバインディングは、自分のプロパティの上で失敗します。 は、ここに私のコードです:KnockoutJSを使用してJSonとMVC 3コントローラデータをバインドできません。

モデル:サンプルデータを見るにJSONを返すと

public class FranchiseInfo 
    { 
     public string FullName { get; set; } 
     public string ShortName { get; set; } 
     public List<string> ServerIps = new List<string>(); 
    } 

コントローラー:

public JsonResult Data() 
     { 
      FranchiseInfo franchiseInfo = new FranchiseInfo(); 
      franchiseInfo.FullName = "PokerWorld"; 
      franchiseInfo.ShortName = "PW"; 
      franchiseInfo.ServerIps.Add("192.111.1.3"); 
      franchiseInfo.ServerIps.Add("192.112.1.4"); 

      return Json(franchiseInfo, JsonRequestBehavior.AllowGet); 
     } 

のJavascriptファイルを使用してノックアウト:

$(function() { 

function viewModel() { 
    var self = this; 
    self.FullName = ko.observable(); 
    self.ShortName = ko.observable(); 
    self.optionValues = ko.observableArray([]); 
    self.ServerIps = ko.observableArray([]); 

    $.getJSON("Home/Data", function (data) { 
     self.FullName(data.FullName); 
     self.ShortName(data.ShortName); 
     self.optionValues([data.FullName, data.ShortName]); 
     for (var i = 0; i < data.ServerIps.length; i++) { 
      self.ServerIps.push({ name: ko.observable(data.ServerIps[i]) }); 
     } 
    }); 

    self.addIp = function() { 
     self.ServerIps.push({ name: ko.observable("0.0.0") }); 
    } 

    self.showIps = function() { 
     alert(self.ServerIps[name]); 
    } 

    self.save = function() { 
     $.ajax({ 
      url: "Home/Save", 
      type: "post", 
      data: ko.toJSON({ FullName: self.FullName, ShortName: self.ShortName, ServerIps: self.ServerIp }), 
      contentType: "application/json", 
      success: function (result) { alert("result") } 
     }); 
    } 
}; 
ko.applyBindings(new viewModel); 

ビュー:

[保存]ボタンをクリックすると
Full Name: 
<span data-bind="text: FullName"></span> 
<input data-bind="value: FullName" /> 
</div> 

<div> 
Short Name: 
<span data-bind="text: ShortName"></span> 
</div> 

<select data-bind="options: optionValues"></select> 

<div data-bind="foreach: ServerIps"> 
    Name: 
    <input data-bind="value: name" /> 
    <span data-bind="text: name" /> 
</div> 

<div data-bind="text: ko.toJSON(ServerIps)"></div> 


<button data-bind="click: addIp">Add IP</button> 

<button data-bind="click: save">Save</button> 

データをJSON形式でサーバーに送信されます。ここでは

はコントローラです:

public JsonResult Save(FranchiseInfo franchiseInfo) 
     { 
      //some data here 
      //return Json result 
     } 

フルネームとショートネームのプロパティは、時にC#のモデルで正しくバインド私はJson形式でサーバーに戻しますが、配列のServerIpsプロパティはバインドできません。私はそれが{name:ip}の形式であり、ServerIpsというモデルプロパティがList型であるためだと思います。これをどうすれば解決できますか?作業例の助けに感謝します。ありがとう。

答えて

0

私はJava Springでも同じ問題がありました。 ViewModelをリクエスト文字列としてシリアライズして解決しました。

は、私たちは(あなたが再帰的なビットを「値が」配列であるかどうかをチェックして行きたいと思うかもしれませんが)機能自分自身を書いた: link

function serializeViewModelToPost(dataString) { 
var data = ko.toJS(dataString); 
var returnValue = ''; 
$.each(data, function (key, value) { 

     returnValue += key + '=' + value + '&'; 

}); 

return returnValue; 
} 

別のオプションは、それをサーバーサイドを解析することです

UPDATE:

self.save = function() { 
    $.ajax({ 
     url: "Home/Save", 
     type: "post", 
     data: serializeViewModelToPost(this)), 
     success: function (result) { alert("result") } 
     }); 

あなたはまだ配列を確認するためにシリアル化機能を編集する必要があります。

+0

あなたは、私が投稿したコードを例に挙げてください。私はjavascriptを初めて使用しています。あなたの甘えを完全に理解することはできません。ありがとうございました。 – Supra

+0

が例として更新されました。私はプロジェクトを持っていないので、私はそれをテストすることはできません。 :) – Yoeri

関連する問題