Knockout (2.2.0)の背後にある概念を把握しようとしています。
私はASP.NET MVC 4を使用しているので、「複雑な」ビューモデル (マスター詳細) を持つ例に従うことができると思いました。
私が見つけた唯一のものはMvcMusicStoreです。
コードは読みやすく、サーバーからビューモデルを読み取り、クライアントでビューモデルを構築する方法を理解しました。
これは私の C# ViewModelです:
public class Person
{
public Person()
{
this.Phones = new List<Phone>();
}
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
public IList<Phone> Phones { get; set; }
}
public class Phone
{
public string Model { get; set; }
public string Number { get; set; }
}
私のコントローラーは、データが取り込まれたモデルをビューに返し、ノックアウト ビューモデルに変換します。
var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
var model = ko.mapping.fromJS(data);
ko.applyBindings(model);
Rob Conery が使用したのと同じパターンを使用しました。上記のコードは単純化されたバージョンです。
これは私の見解です:
@using (@Html.BeginForm("Index", "Home", FormMethod.Post))
{
<input id="Name" name="Name" type="text" data-bind="value: Name" value="" />
<br />
<input id="Surname" name="Surname" type="text" data-bind="value: Surname" value="" />
<br />
<table>
<tbody data-bind="foreach: Phones">
<tr>
<td><input type="text" data-bind='value: Model' /></td>
<td><input type="text" data-bind='value: Number' /></td>
</tr>
</tbody>
</table>
<input type="submit" value="Send" />
}
ここで、フォームを送信し、コントローラーで更新されたビューモデルを読み取りたいと思います。
これを実現するために、MvcMusicStore にあるのと同じソリューションを使用しました。49 行
目を見ると、Rob は FORM をシリアル化しようとしています。
var data = $("#orderForm").serialize();
そしてコントローラへの POST:
$.post("/orders/edit", data, callback);
このコードをビューモデルで機能させることができないようです。私のコントローラー:
[HttpPost]
public JsonResult Index(Models.Person viewModel)
{
...
}
子を逆シリアル化できないようです。クライアント側をデバッグすると、seralize
メソッドもそれらをシリアル化できないことがわかります。
実際、なぜ彼が FORM をシリアライズしようとしているのかわからない。ノックアウトによって管理されるビューモデルがあるためです。このような「複雑な」モデルをシリアル化し、コントローラーに POST できる他の方法はありませんか?
ソリューション ( MvcMusicStore ) が適切に機能していると思いますか、それとも他のパターンに従う必要がありますか?
どんな助けでも大歓迎です。
アップデート
解決策を見つけたと思いますが、さらにテストを行う必要があります。toJSON KO メソッド
を使用する場合:
var data = ko.toJSON(model);
ビューモデル全体を適切にシリアル化できます。次に、$.ajax を使用してデータを POST する必要があります
$.ajax({
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
url: "/Home/Index",
data: dataToSave,
success: callback,
error: function (req, status, error) {
alert("Status: " + status + " Error: " + error);
}
});
この方法ですべてがうまくいくように見えますが、それでも、推奨される方法があるかどうか知りたいです。
解決
Michael Berkompas と nemesv は有益な情報を提供してくれました。他の誰かが興味を持った場合に備えて、簡単なアプリケーションをまとめました。