ノックアウト js が入力された 2 つのドロップダウン リストがあり、2 つの質問があります。
1)これが Model.StreetList から入力される理由
@Html.DropDownListFor(m => m.SelectedStreet, Model.StreetList, new {onchange = "FetchHouses();"})
しかし、これはそうではありません
@Html.DropDownListFor(m => m.SelectedStreet, Model.StreetList, new {onchange = "FetchHouses();", @data_bind = "options: StreetList, optionsText: 'Name', optionsValue: 'Id', optionsCaption: 'Select...'"})
モデルからデフォルトでデータを取り込むことは可能ですが、何らかのイベントが発生した場合は、ノックアウト バインディングでデータを取り込むことができますか?
2) フォームの送信後、ModelState が無効な場合、これら 2 つのドロップリストの選択された値は失われます。これを解決するにはどうすればよいですか?
<p>
@Html.LabelFor(m => m.SelectedStreet, @Resources.RegistrationStreet)
@Html.DropDownListFor(m => m.SelectedStreet, Model.StreetList, new {onchange = "FetchHouses();", @data_bind = "options: StreetList, optionsText: 'Name', optionsValue: 'Id', optionsCaption: 'Select...'"})
</p>
<p>
@Html.LabelFor(m => m.SelectedHouse, @Resources.RegistrationHouse)
@Html.DropDownListFor(m => m.SelectedHouse, Model.HouseList, new { @data_bind="options: HouseList, optionsText: 'Number', optionsValue: 'Id'"})
</p>
どんな助けでも大歓迎です!
編集:
ノックアウト.jsバインディングは変更イベントで発生し、正常に動作します.問題は、変更イベントが発生していない間に、MVCモデルからドロップダウンを作成したいということです.バインディングを行うjsコードは次のとおりです:
function CascadingDdLViewModelStreet() {
this.StreetList = ko.observableArray([]);
this.HouseList = ko.observableArray([]);
}
var objVMStreet = new CascadingDdLViewModelStreet();
ko.applyBindings(objVMStreet);
function FetchStreets() {
objVMStreet.HouseList([]);
objVMStreet.StreetList([]);
var cityCode = $("#SelectedCity").val();
$.getJSON("/Account/GetStreets/" + cityCode, null, function(data) {
objVMStreet.StreetList(data);
});
}
function FetchHouses() {
var streetCode = $("#SelectedStreet").val();
$.getJSON("/Account/GetHouses/" + streetCode, null, function(data) {
objVMStreet.HouseList(data);
});
}
完全なコードは次のとおりです。
表示: http://pastebin.com/jva9ff8A
モデル: http://pastebin.com/vDQkg0d5
コントローラー: http://pastebin.com/avBuRy9D