Knockout で選択ボックスの値をリスト項目のプロパティにバインドするにはどうすればよいですか?
MyViewModel の IEnermerable に対する ASP.NET MVC の強く型付けされたビューがあり、MyViewModel は次のように定義されています。
public class MyViewModel{
public int Id {get;set;}
public string Name {get;set;}
public int Status{get;set;}
}
ユーザーがドロップダウンを使用してステータスを変更できるように、MyViewModelのコレクションをデータバインドするためにノックアウトを使用しています。私のビュー js は次のようになります。
$(document).ready(function () {
ko.applyBindings(new ViewModel());
});
var statusItems = [
{ id: 0, name: 'New' },
{ id: 1, name: 'Improved' },
{ id: 2, name: 'Bad' }
];
function ViewModel() {
var self = this;
self.Items = ko.observableArray(@Html.Raw(Json.Encode(Model)));
self.statuses = statusItems;
self.remove = function () {
if (confirm('Are you sure you want to remove the entry?\nThis operation cannot be undone.')) {
self.Items.remove(this);
}
}
}
そして、私のマークアップは
<div id="dashboard-div">
@using (Ajax.BeginForm("Save", "Dashboard", new AjaxOptions { HttpMethod = "Post" }, new { id = "dashboardForm" }))
{
<table>
<thead>
<tr>
<th>Name</th>
<th>Status</th>
</tr>
</thead>
<tbody data-bind="foreach: Items">
<tr>
<td><span data-bind="text: Name" /><input type="hidden" data-bind="value: Id, attr: { name: '['+$index()+'].Id'}" /></td>
<td>
<select id="status-dropdown" data-bind="options: $parent.statuses, optionsText: 'name', optionsValue: 'id', value: Status" />
</td>
</tr>
</tbody>
</table>
</div>
<button data-bind="enable: Items().length > 0" type="submit">Save</button>
}
</div>
私が抱えている問題は、ドロップダウン値がステータスにバインドされていないことです。最初のページの読み込み時に、ドロップダウン値が適切に設定されます。つまり、データベースで 1 の場合、「改善」が選択されますが、コントローラーの Save メソッドに到達すると、各アイテム (MyViewModel) のステータスは 0 です。Status プロパティを文字列型に変更すると、すべてが再び機能するまでStatus のすべての値が null であるコントローラーに到達します。