我很好奇如何在不使用剃须刀时处理模型绑定,而是使用一些客户端框架(淘汰赛,角球等)。
例如,模型绑定器需要[0].Collection[0].Property
之类的名称,razor会自动为具有嵌套集合的复杂对象生成。
如何利用客户端技术,在满足这些要求的同时动态更新模型?是否有更简单的方法或必须手动创建/重新创建索引等。
答案 0 :(得分: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#ViewModel
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" />
因此,当您将这些POST发送到控制器时,模型绑定器将正常工作并使用适当的OrderNumber构建订单列表。
现在我们的订单存储在observableArray中,如果我们调用AddOrder或RemoveOrder,所有索引都将由knockout js自动更新,从而为我们的模型绑定器保留索引,而不需要我们的其他操作来使其工作。 / p>