2014-04-17 41 views
0

我很好奇,如何模型绑定不使用剃刀但是一些客户端框架(敲除,角等)时的处理。MVC而不助手结合

例如模型绑定需要像[0].Collection[0].Property一个名字,这剃刀将与嵌套集合的复杂对象自动生成。

怎样一个杠杆客户端技术,它允许一个动态更新模式,且仍满足这些要求?有没有一种简单的方法,或者必须一个手动创建/重新创建索引等

+0

你必须自己制作的标记 - 但大多数客户端框架会给你各种模板工具,帮助简化流程。 –

+0

有客户端MVV工具像knockoutjs,这将帮助你实现这个 –

+0

谢谢。对于我问到的框架有什么好的参考?也许我只是不知道我在寻找什么,但我还没有找到任何关于这个问题的内容。我想了解它是如何工作的 – aw04

回答

1

当客户端框架,以处理代表你的模型,你再也不用担心手工为您的藏品都表示为JavaScript数组创建索引。

一个例子使用knockoutjs:

敲除视图模型

var OrdersModel = function (Order) { 
    var self = this; 

    self.OrderNumber = ko.observable(Order ? Order.OrderNumber : 0); 
} 

var ViewModel = function() { 
    var self = this; 

    self.Orders = ko.observableArray([]); 

    self.AddOrder = function (Order) { 
     self.Orders.push(Order); 
    } 

    self.RemoveOrder = function (Order) { 
     self.Orders.remove(Order); 
    } 

    self.LoadOrders = function() { 
     // AJAX to load orders from DB 
    } 

    self.LoadOrders(); 
} 

HTML

<section id="orders" data-bind="foreach: Orders"> 
    <input type="text" data-bind="attr: { 
             name: 'Orders[' + $index() + '].OrderNumber 
            }" /> 
</section> 

C#模型

public class OrderModel { 
    public int OrderNumber { get; set; } 
} 

C#视图模型

public class OrdersViewModel { 
    public List<OrderModel> Orders { get; set; } 

    public OrdersViewModel() { 
     this.Orders = new List<OrderModel>(); 
    } 
} 

这是一个非常简单的例子,但淘汰赛JS将建立像输入:当您发布这些到控制器,模型绑定

<input type="text" name="Orders[0].OrderNumber" /> 
<input type="text" name="Orders[1].OrderNumber" /> 

所以将适当地工作,并建立一个订单清单与适当的OrderNumber。

现在,我们的订单存储在observableArray中,如果我们调用AddOrder或RemoveOrder,所有索引都将通过knockout js自动更新,因此保留了我们的模型绑定器的索引,而不需要额外的操作来使其工作。