Asp.net mvc 4 如何通过MVC4 upshot上传相关实体

Asp.net mvc 4 如何通过MVC4 upshot上传相关实体,asp.net-mvc-4,upshot,Asp.net Mvc 4,Upshot,我将一个简单的DTO实体a加载到我的upshot viewmodel中,它可以通过Knockoutjs轻松查看 我的DTO A包含一个实体列表。所以我可以对A中的元素进行分析 再次: class A { someprop; List<B> childB; } Class B { somepropB; } A类 { someprop; 名单b; } B类 { somepropB; } 到目前为止还不错。我可以毫无问题地迭代数据。

我将一个简单的DTO实体a加载到我的upshot viewmodel中,它可以通过Knockoutjs轻松查看

我的DTO A包含一个实体列表。所以我可以对A中的元素进行分析

再次:

class A
    {
       someprop;
        List<B> childB;
    }
Class B
{
   somepropB;
}
A类
{
someprop;
名单b;
}
B类
{
somepropB;
}
到目前为止还不错。我可以毫无问题地迭代数据。 但是,如果我在一个SaveAll实例中更改“someprop”,服务器将根本不响应。 updateData controlle方法甚至没有被调用。 如果我在将childB.clear()传输到客户端之前清除它,一切正常


结果似乎是无法使用集合更新实体?

如果您希望这样的场景能够工作,那么还有一些工作要做。“结果显示”仅在可观察项中打开父实体。因此,只有类A的javascript表示是可忽略的,而类B的javascript表示则不是。因此,Upshot不知道关联对象中的任何更改

解决方案是手动映射实体。为了让我的生活更轻松,我在下面的代码片段中使用了“DeliveryTracker”示例应用程序中的代码。在我的博客文章中,你可以看到一个手动映射的例子:下面我的例子是关于“delivery”和“customer”对象的

服务器端域模型
namespace StackOverflow.q9888839.UploadRelatedEntities.Models
{
公共类客户
{
[关键]
public int CustomerId{get;set;}
公共字符串名称{get;set;}
公共字符串地址{get;set;}
公共双纬度{get;set;}
公共双经度{get;set;}
公共虚拟ICollection传递{get;set;}
}
公共课堂教学
{
[关键]
public int DeliveryId{get;set;}
公共字符串说明{get;set;}
公共布尔值被传递{get;set;}
[IgnoreDataMember]//需要中断循环引用
公共虚拟客户客户{get;set;}
公共虚拟int CustomerId{get;set;}
}
公共类AppDbContext:DbContext
{
公共数据库集客户{get;set;}
公共数据库集传递{get;set;}
}
}
数据服务控制器 数据服务控制器在服务器上公开符合OData标准的数据 "http://localhost:[yourport]/api/dataservice/GetCustomers”。为了能够更新客户和交付,您需要定义UpdateCustomer和UpdateDelivery函数

namespace StackOverflow.q9888839.UploadRelatedEntities.Controllers
{
公共类DataServiceController:DbDataController
{
//面向客户的服务接口
公共IQueryable GetCustomers()
{
返回DbContext.Customers.Include(“Deliveries”).OrderBy(x=>x.CustomerId);
}
public void InsertCustomer(客户客户){InsertEntity(客户);}
public void UpdateCustomer(客户){UpdateEntity(客户);}
public void DeleteCustomer(客户客户){DeleteEntity(客户);}
//交付服务接口
公共void InsertDelivery(Delivery Delivery){InsertEntity(Delivery);}
public void UpdateDelivery(传递){UpdateEntity(传递);}
public void DeleteDelivery(Delivery Delivery){DeleteEntity(Delivery);}
}
}
客户端域模型 添加包含客户端模型的新javascript文件。在这里,我明确地将每个属性都转化为一个淘汰的可观察对象。解决问题的关键是Customer对象构造函数中的一行,我将传入的交付映射到一个可观察的数组中

//
(函数(窗口,未定义){
var deliveryTracker=window[“deliveryTracker”]={};//清除名称空间
deliveryTracker.DeliveriesViewModel=函数(){
//私人的
var self=这个;
self.dataSource=upshot.dataSources.Customers;
self.dataSource.refresh();
self.customers=self.dataSource.getEntities();
};
deliveryTracker.Customer=功能(数据){
var self=这个;
self.CustomerId=ko.observable(data.CustomerId);
self.Name=ko.observable(data.Name);
self.Address=ko.observable(data.Address);
自身纬度=可观测的ko(数据纬度);
self.Longitude=ko.observable(data.Longitude);
self.Deliveries=ko.observearray(ko.utils.arrayMap(data.Deliveries,function(item)){
返回新的deliveryTracker.Delivery(项目);
}));
结果:addentityproperty(self,“Customer:#StackOverflow.q9888839.UploadRelatedEntities.Models”);
};
deliveryTracker.Delivery=函数(数据){
var self=这个;
self.DeliveryId=ko.observable(data.DeliveryId);
self.CustomerId=ko.observable(data.CustomerId);
self.Customer=ko.observable(data.Customer?new deliveryTracker.Customer(data.Customer):空);
自我描述=可观察(数据描述);
self.IsDelivered=ko.可观察(data.IsDelivered);
结果:addEntityProperties(self,“Delivery:#StackOverflow.q9888839.UploadRelatedEntities.Models”);
};
//将deliveryTracker公开给全球
窗口[“deliveryTracker”]=deliveryTracker;
})(窗口);
景色 在index.cshtml中初始化Upshot,指定自定义客户端映射并绑定viewmodel

@(Html.UpshotContext(bufferChanges:false)
.DataSource(x=>x.GetCustomers())
.ClientMapping(“deliveryTracker.Customer”)
.ClientMapping(“deliveryTracker.Delivery”)
)
$(函数(){
var model=new deliveryTracker.DeliveriesViewModel();
ko.应用绑定(模型);
});
客户