Asp.net mvc 3 ASP.NETMVC视图模型>;调用UpdateModel时出现模型问题
我遇到了一个需要帮助的问题。我有一个MVC 3应用程序,当我发回一个编辑视图时,我试图获取表单值,但我显然是做错了 我有3个表,其中实体框架对象映射到它们。请求者可以有一个订单,而该订单又可以有多个OrderDetails 我还为这些实体中的每一个创建了视图模型,我还创建了一个名为Edit的强类型视图,该视图显示了所有信息,我用以下代码填充了ViewModels-这一切都很好,仅用于背景信息:Asp.net mvc 3 ASP.NETMVC视图模型>;调用UpdateModel时出现模型问题,asp.net-mvc-3,Asp.net Mvc 3,我遇到了一个需要帮助的问题。我有一个MVC 3应用程序,当我发回一个编辑视图时,我试图获取表单值,但我显然是做错了 我有3个表,其中实体框架对象映射到它们。请求者可以有一个订单,而该订单又可以有多个OrderDetails 我还为这些实体中的每一个创建了视图模型,我还创建了一个名为Edit的强类型视图,该视图显示了所有信息,我用以下代码填充了ViewModels-这一切都很好,仅用于背景信息: //Grab the Requestor and corresponding order from
//Grab the Requestor and corresponding order from the database
var requestors = from r in db.Requestors
where r.RequestorID == id
join o in db.Orders on r.RequestorID equals o.RequestorID
select
new RequestorViewModel
{
RequestorID = r.RequestorID,
FirstName = r.FirstName,
LastName = r.LastName,
AddressStreet = r.AddressStreet,
AddressNumber = r.AddressNumber,
AddressCity = r.AddressCity,
AddressPostalCode = r.AddressPostalCode,
AddressProvince = r.AddressProvince,
Individual = r.Individual,
Organization = r.Organization,
PhoneNumber = r.PhoneNumber,
Email = r.Email,
Comment = r.Comment,
Order = new OrderViewModel
{
OrderID = o.OrderID,
TotalPamphlets = o.TotalPamphlets,
OrderCompletionDate = o.OrderCompletionDate,
OrderDate = o.OrderDate,
DateRequired = o.DateRequired
}
};
RequestorViewModel requestor = requestors.Single<RequestorViewModel>();
//Get the OrderDetails associated with the Order
var orderdetails = from od in db.OrderDetails
where od.OrderID == requestor.Order.OrderID
select new OrderDetailViewModel
{
OriginalQuantity = od.OriginalQuantity,
UpdatedQuantity = od.UpdatedQuantity,
PamphletID = od.PamphletID
};
requestor.Order.OrderDetails = orderdetails.ToList<OrderDetailViewModel>();
return requestor;
下面是我的编辑视图示例:
![编辑视图][2]
对于“请求者”和“订单”部分,我使用Visual Studio生成的默认模板,编辑器如下所示:
请求者:@Html.editor for(model=>model.FirstName)
订单:@Html.EditorFor(model=>model.Order.OrderCompleted)
在我的OrderDetails部分,我用以下约定命名我的控件(它们在循环中(为了简洁而缩短)
当我查看表单集合时,Requestor、Order和Orderdetail的键如下所示(一些示例,因为我无法发布屏幕截图):
[1] 请求者
[17] Order.OrderCompleted
[22]订单详细信息[0]。原始数量
这是因为我没有将OrderViewModel和OrderDetailViewModel显式转换为各自的EF实体吗?还是因为我做错了其他事情?非常感谢您的帮助
Jason您说过有3个表映射了实体框架对象。我建议在这三个实体之间创建关联。如果希望EF附加关联的实体,您需要在实体上创建关联,这样两个表上都可能有关联(来回) 如果您正在进行服务器绑定,则在两个表上都有关联是可以的,但如果您正在进行Ajax绑定,则有时会出现与循环引用相关的问题。创建关联后,您可以包含实体,EF将管理在需要时进行连接并更新数据 您可以使用XML编辑器打开EF,但您不需要;我只是从XML编辑器中获取了这一点,以便轻松地将其粘贴到此处,并为您提供所需内容的视觉效果。这只创建了两个关联,一个是从请求者到订单,另一个是从订单到订单。\u项,使用外键值,visual studio painter使其变得简单
// one to many association between order and order_line
<Association Name="FK_xxx">
<End Role="order" Type="LINKDIRModel.Store.order" Multiplicity="1" />
<End Role="order_line" Type="LINKDIRModel.Store.order_line" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="order">
<PropertyRef Name="order_line" />
</Principal>
<Dependent Role="order_line">
<PropertyRef Name="order_id" />
</Dependent>
</ReferentialConstraint>
</Association>
// controller code... for delete int order lines and updating order
[HttpPost, ActionName("OrderDelete")]
[GridAction]
public ActionResult DeleteRequestor(int id)
{
// get order from EF along with all order_items.
order myOrder = db.order.Include("order_line").Single(l => l.requestor_id == id);
// We can delete a few order_lines and update the order easily
List<order_line> myLines =
db.order.order_line.Where(o => o.order_id == id && o.order_amt == 1.00).ToList();
// update the order
MyOrder.order_comment = "deleted all the items with price of one dollar!";
MyOrder.order_total = MyLines.Take(myLines.Count()).Sum(e => e.order_line_amt);
MyOrder.DeleteObject(myLines);
// save changes.
db.SaveChanges();
return View(new GridModel(db.requestor));
}
//订单和订单行之间的一对多关联
//控制器代码…用于删除整数订单行和更新订单
[HttpPost,ActionName(“OrderDelete”)]
[行动]
public ActionResult DeleteRequestor(int-id)
{
//从EF获得订单以及所有订单项目。
订单myOrder=db.order.Include(“订单行”).Single(l=>l.requestor\u id==id);
//我们可以删除一些订单行并轻松更新订单
列表myline=
db.order.order\u line.Where(o=>o.order\u id==id&&o.order\u amt==1.00).ToList();
//更新订单
MyOrder.order_comment=“删除了所有价格为1美元的项目!”;
MyOrder.order_UTotal=MyLines.Take(MyLines.Count()).Sum(e=>e.order_line\u amt);
删除对象(myLines);
//保存更改。
db.SaveChanges();
返回视图(新的GridModel(db.requestor));
}
@foreach (var od in Model.Order.OrderDetails) {
int i = 0;
@Html.TextBox("OrderDetails[" + i + "].OriginalQuantity", od.OriginalQuantity)
i++
}
// one to many association between order and order_line
<Association Name="FK_xxx">
<End Role="order" Type="LINKDIRModel.Store.order" Multiplicity="1" />
<End Role="order_line" Type="LINKDIRModel.Store.order_line" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="order">
<PropertyRef Name="order_line" />
</Principal>
<Dependent Role="order_line">
<PropertyRef Name="order_id" />
</Dependent>
</ReferentialConstraint>
</Association>
// controller code... for delete int order lines and updating order
[HttpPost, ActionName("OrderDelete")]
[GridAction]
public ActionResult DeleteRequestor(int id)
{
// get order from EF along with all order_items.
order myOrder = db.order.Include("order_line").Single(l => l.requestor_id == id);
// We can delete a few order_lines and update the order easily
List<order_line> myLines =
db.order.order_line.Where(o => o.order_id == id && o.order_amt == 1.00).ToList();
// update the order
MyOrder.order_comment = "deleted all the items with price of one dollar!";
MyOrder.order_total = MyLines.Take(myLines.Count()).Sum(e => e.order_line_amt);
MyOrder.DeleteObject(myLines);
// save changes.
db.SaveChanges();
return View(new GridModel(db.requestor));
}