2013-07-29 39 views
0

我使用Knockout MVChere將knockout整合到我的網站,但我遇到了問題。如果我的模型包含另一個對象,則綁定將失敗。例如,這裏是我的模型:在MVC中使用Knockout MVC綁定數據與嵌套對象4

public class HelloWorldModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [Computed] 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 

    public ProductModel ProductModel { get; set; } 
} 

這裏是我ProductModel

public class ProductModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
    public int CategoryId { get; set; } 
    public bool IsActive { get; set; } 
} 

這些模型只是用於測試,所以他們是非常簡單的。這是我的看法:

@using PerpetuumSoft.Knockout 
@model MyStore.UI.Models.HelloWorldModel 

@{ 
    ViewBag.Title = "HelloWorld"; 
    var ko = Html.CreateKnockoutContext(); 
} 

<p> 
    Name: @ko.Html.TextBox(x => x.ProductModel.Name) 
</p> 
<p> 
    Price: @ko.Html.TextBox(x => x.ProductModel.Price) 
</p> 
<h2> 
    Product @ko.Html.Span(x => x.ProductModel.Name), @ko.Html.Span(x => x.ProductModel.Price) 
</h2> 

<p>First name: @ko.Html.TextBox(m => m.FirstName)</p> 
<p>Last name: @ko.Html.TextBox(m => m.LastName)</p> 
<h2>Hello, @ko.Html.Span(m => m.FullName)!</h2> 

@ko.Apply(Model) 

但它失敗了。沒有出現。 <input/>是空白的,<span>也是空白的。這裏有什麼錯誤的東西?我想在綁定上下文中有些問題。請幫幫我。非常感謝。

編輯!這裏是自動生成HTML的一部分:

結合:

Name: <input data-bind="value : ProductModel().Name" /> 

視圖模型:

var viewModelJs = {"FirstName":"AAA","LastName":"BBB","FullName":"AAA BBB","ProductModel":{"Id":0,"Name":"Coca Cola","Price":123.0,"CategoryId":0,"IsActive":false}}; 
+2

只是一個提示,淘汰MVC是一個巨大的反模式。不要這樣做。它是Web Forms的混蛋兒。我們很努力地擺脫Web窗體,KO MVC把我們帶回了 – Anders

+0

但是現在,我需要使用它:( – AnhTriet

+1

這是Knockout MVC庫的已知和可悲的開放問題請參閱:[數據綁定屬性爲嵌套對象是無效的](https://github.com/AndreyAkinshin/knockout-mvc/issues/12)作爲解決方法使用可以使用with綁定:@using(var subModel = ko .mith(m => m.ProductModel)) {@ subModel.Html.TextBox(x => ko.Model..Name)' – nemesv

回答

1

由於nemesv的評論,我已經找到了解決辦法。要訪問嵌套對象,這裏是Product,我們使用With綁定。這裏是代碼的觀點:

@using (var product = ko.With(x => x.ProductModel)) 
{ 
    <p> 
     Name: @product.Html.TextBox(x => x.Name) 
    </p> 
    <p> 
     Price: @product.Html.TextBox(x => x.Price) 
    </p> 
    <h2> 
     Product @product.Html.Span(x => x.Name), @product.Html.Span(x => x.Price) 
    </h2> 
} 

<p>First name: @ko.Html.TextBox(m => m.FirstName)</p> 
<p>Last name: @ko.Html.TextBox(m => m.LastName)</p> 
<h2>Hello, @ko.Html.Span(m => m.FullName)!</h2>