使用這篇文章張貼在CodeProject.com,「Using KnockoutJS in your ASP.NET applications」作爲指南我試圖創建一個可重用的,數據加載下拉列表使用ASP.NET 3.5 Web Forms,但是它利用KnockoutJS進行客戶端數據綁定。此下拉菜單的多個獨立實例應該能夠在同一頁面中獨立生活。堅持敲除ASP.NET WebForms服務器端帖子之間的ViewModel ...
到目前爲止,CodeProject.com的帖子在指導我如何設置和我成功地將更新後的ViewModel數據作爲JSON字符串在服務器和客戶端之間來回傳遞,並將其轉換爲和從一個對象(都在服務器和客戶端上)。我所掛的是簡單的部分,將ViewModel綁定到下拉列表!
因此,我首先將JSON字符串加載到隱藏字段中。它包括一個Regions和一個SelectedRegion列表。
<input type="hidden" id="ddlRegionKO_hdnRegionListVMStorage" value="{"Regions":[{"RegionName":"Mid Atlantic USA","RegionId":2},{"RegionName":"Mid West USA","RegionId":10},{"RegionName":"North Central USA","RegionId":5},{"RegionName":"North East USA","RegionId":1},{"RegionName":"North West USA","RegionId":7},{"RegionName":"Other","RegionId":9},{"RegionName":"South Central USA","RegionId":6},{"RegionName":"South East USA","RegionId":3},{"RegionName":"South West USA","RegionId":8}],"SelectedRegion":{"RegionName":"North Central USA","RegionId":5}}" />
然後,我使用ko.utils.parseJson()
函數將該字符串轉換爲Javascript對象。
var stringViewModel = document.getElementById("ddlRegionKO_hdnRegionListVMStorage").value;
var ddlRegionKO_pnlRegionDDLContainer_ViewModel = ko.utils.parseJson(stringViewModel);
然後我轉換屬性定義爲ko.observable
和ko.observableArray
方法(這是將要進行重構的部分之一,但作爲一個概念證明就足夠了)。
//
// Convert all the model properties to KO Propety/Methods
for (var propertyName in ddlRegionKO_pnlRegionDDLContainer_ViewModel) {
switch(propertyName.toUpperCase())
{
//
// Multiple Region objects are stored as an array in the regions property.
case "REGIONS":
ddlRegionKO_pnlRegionDDLContainer_ViewModel[propertyName] = ko.observableArray(ddlRegionKO_pnlRegionDDLContainer_ViewModel[propertyName]);
break;
//
// Only a single region may be selected at any time.
case "SELECTEDREGION":
ddlRegionKO_pnlRegionDDLContainer_ViewModel[propertyName] = ko.observable(ddlRegionKO_pnlRegionDDLContainer_ViewModel[propertyName]);
break;
};
};
鑑於此,我希望在下拉列表中,且能夠選擇SelectedRegion當applyBindings
方法被調用......
ko.applyBindings(ddlRegionKO_pnlRegionDDLContainer_ViewModel);
我在的jsfiddle把所有在一起.. here ...我懷疑我可能會忽視某些東西,但我看不到它會是什麼。一切看起來都適合我。
如果有人能看到我忽略的東西,我會非常感激!
感謝,
-g
謝謝!我upvoted你的答案,因爲我不知道「optionsValue」屬性,並得到下拉列表加載與Json數據區域列表。但這只是中途。基於綁定,我期望SelectedRegion在下拉列表中被預先選定(它在ModelView中定義)。另外,當我嘗試將文本框綁定到下拉列表(data-bind =「text:SelectedRegion()。RegionName」)時,沒有任何反應。那麼我可能會定義「SelectedRegion」的方式有什麼問題?再次感謝!! –
@ GaryO.Stenstrom對不起,我第一次沒有看到。看我的編輯。長話短說,我的解決方案將設置選定的值,但你必須做一些挖掘如何將選定的值綁定到對象。看看我提供的鏈接,看看是否有幫助,或開始閱讀通過淘汰賽文件。 – hawkke
我向JsFiddle(http://jsfiddle.net/Ds44T/6/)添加了一個綁定文本框,但它只能在IE中使用,而不能在任何其他瀏覽器中使用。 –