Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NETMVC视图模型>;调用UpdateModel时出现模型问题_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 ASP.NETMVC视图模型>;调用UpdateModel时出现模型问题

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

我遇到了一个需要帮助的问题。我有一个MVC 3应用程序,当我发回一个编辑视图时,我试图获取表单值,但我显然是做错了

我有3个表,其中实体框架对象映射到它们。请求者可以有一个订单,而该订单又可以有多个OrderDetails

我还为这些实体中的每一个创建了视图模型,我还创建了一个名为Edit的强类型视图,该视图显示了所有信息,我用以下代码填充了ViewModels-这一切都很好,仅用于背景信息:

 //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));
  }