2012-05-24 205 views
1

是否可以將數據從模型綁定到挖空視圖模型。這裏有一個例子:將模型數據綁定到Knockout ViewModel?

public ActionResult Edit(int id) 
{ 
    Product product = _db.Products.FirstOrDefault(x=>x.ItemId == id); 
    return View(product); 
} 

然後在查看我歷來做一些像這樣:

@model myApp.Models.Product 

@using(Html.BeginForm()) 
{ 
    @Html.EditorFor(x=>x.ItemName) 
    @Html.ValidationMessageFor(x=>x.ItemName) 

    <input type="submit" value="Update" /> 
} 

但隨着淘汰賽我會創造從那裏我會做一些像EditProductViewModel

var EditProductViewModel = { 
    ItemName = ko.observable('') 
}; 

EditProductViewModel.Edit = function() { 
    $.ajax({ 
     url: "Home/Edit", 
     data: ko.ToJson(this), 
     success: function() { 
      // do something 
     } 
    }); 
}; 

$(function() { 
    ko.applyBindings(EditProductViewModel); 
}); 

而不是使用Html幫助者我會做這樣的事情在我看來:

<form data-bind="submit: Edit"> 
    <input type="text" data-bind="value: ItemName" /> 
    <input type="submit" value="Update" /> 
</form> 

那麼我怎樣才能用我的控制器返回的數據填充這個?

回答

1

我沒有用一個淘汰賽任何經驗,但它似乎對我說,你不再想從你的控制器返回一個視圖怎麼樣

return JSON(product) 

這樣你會得到一個JSON元素產品在你的javascript成功功能上你需要收集json元素

$.ajax({ 
    url: "Home/Edit", 
    data: ko.ToJson(this), 
    success: function(data) { 
     // map to knockout view model 
    } 
}); 

然後從這裏你會調用映射綁定。

+0

但我的行動需要返回一個視圖,否則視圖如何從我的編輯行動加載?爲了以JSON格式加載模型,額外的操作似乎很麻煩? – CallumVass

+0

你爲什麼使用兩種方法來渲染視圖?似乎如果你想要一個JavaScript方法來渲染視圖,你應該充分使用JavaScript並擺脫MVC視圖。或相反亦然 –

1

使用敲除時,您有兩種方法可以做到這一點。 1.在一個視圖中加載你的文本框等。第一次加載該視圖時,將模型轉換爲JSON,並在初始加載時使用淘汰賽。

所有通過JSON進行的其他呼叫。

您可以在視圖中使用: @Html.Raw(Json.Encode(yourModel))

  1. 裝入文本框在您的視圖(即他們是你的視圖的一部分) 觸發器關上的document.ready()你的Ajax調用,讓您的數據從你的控制器,轉換成JSON即return Json(yourModel, JsonRequestBehavior.AllowGet)和大致綁定這些結果如你已經在做上述

注意 - 這種方法的缺點是與驗證。如果你有所有的客戶端驗證,那麼這是好的,因爲data-*的屬性已經被MVC寫出到你的文本框等等。如果你有任何服務器端驗證,這裏沒有集成的'流暢'與淘汰賽。

有一個像樣的文章在這裏: http://www.codeproject.com/Articles/305308/MVC-Techniques-with-JQuery-JSON-Knockout-and-Cshar 但仍然缺乏對服務器端驗證提。

0

您可以將數據序列化到您的頁面,然後使用服務器中的值初始化挖空視圖模型。

ItemName = ko.observable(serializedModel.ItemName);