サーバー側のプロパティで追加/削除操作を実行するために、knockout.js を使用しようとしています。私の C# モデルは次のようになります。
public class MyModel
{
[Key]
public int MyModelId { get; set; }
[Required]
public string Name { get; set; }
private IEnumerable<string> _Items;
[Required]
public IEnumerable<string> Items
{
get { return _Items; }
set { _Items = value; }
}
//Used to store in SQL database
public string ItemsSQL
{
get { return _Items != null ? String.Join(";", _Items) : null; }
set { _Items = value != null ? value.Split(';').ToList() : null; }
}
}
私のViewModelは次のようになります。
@model MyProject.Models.MyModel
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/knockout-2.1.0.js")" type="text/javascript"></script>
<script type="text/javascript">
@{
var initialData = new JavaScriptSerializer().Serialize(Model);
}
var viewModel = {
MyModel: ko.observable(@Html.Raw(initialData)),
//Commented out on purpose
//Items: ko.observableArray(this.MyModel.Items),
addItem: function() {
this.MyModel.Items.push("");
},
removeItem: function(item) {
this.MyModel.Items.remove(item);
},
};
alert(JSON.stringify(@Html.Raw(initialData)));
$(document).ready(function() {ko.applyBindings(viewModel); });
</script>
そして、これが私の見解です:
Name: <span data-bind="text: MyModel().Name"></span>
<br />
Items: <button data-bind="click: addItem">Add Item</button>
<table>
<tbody data-bind="template: { name: 'itemTemplate', foreach: MyModel().Items}"></tbody>
</table>
<script type="text/html" id="itemTemplate">
<tr>
<td>
<input data-bind="value: $data" />
<a href="#" data-bind="click: function() {
viewModel.removeItem($data) }">Remove Item</a>
</td>
</tr>
</script>
これは、テキスト ボックスMyModel.Name
に表示される各項目と共にMyModel.Items
表示されます。私の問題は、インスタンス化しようとするとItems
、エラーメッセージが吐き出されることです。
Unable to get value of the property 'Items': object is null or undefined.
これは、追加および削除操作にも影響します。
アップデート
実行するとalert(JSON.stringify(this.MyModel));
、MyModel が未定義であることが示されますが、実行するとalert(JSON.stringify(@Html.Raw(initialData)));
、モデルが JSON 形式で表示されます。私のモデルは正しくシリアル化されていますが、ノックアウトは C# 変数から監視可能なプロパティを作成できませんか? 知らない。カミソリが痛い。