没有助手的mvc绑定

时间:2014-04-17 17:19:39

标签: asp.net-mvc angularjs knockout.js model-binding

我很好奇如何在不使用剃须刀时处理模型绑定,而是使用一些客户端框架(淘汰赛,角球等)。

例如,模型绑定器需要[0].Collection[0].Property之类的名称,razor会自动为具有嵌套集合的复杂对象生成。

如何利用客户端技术,在满足这些要求的同时动态更新模型?是否有更简单的方法或必须手动创建/重新创建索引等。

1 个答案:

答案 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>