Asp.net mvc ASP.NET MVC基于主-明细关系创建
我正在显示给定订单的项目列表。当用户单击Add Item时,我重定向到Item/Create页面。此页面收集必要的输入,但还需要知道项目所属的订单id。将OrderID传递给Item/Create的适当方式是什么,以便在保存新创建的项时,它在表单post中仍然有效 我已经使用了TempData,并通过Html.Encode()将id写在详细信息页面上。它让我在某种程度上了解到,id显示在item表单上,但当表单提交和发布时,该值丢失。我想是因为它不是formcollection的一部分。我猜我的变通方法不是最好的方法,我想知道是否有人能在asp.net mvc中指出正确的方法 我使用了这个序列(如果有错误,很抱歉,我从一个工作示例中选取了这个序列,并根据您的问题对其进行了修改): 1)。详细信息视图(假设模型为订单类型):Asp.net mvc ASP.NET MVC基于主-明细关系创建,asp.net-mvc,Asp.net Mvc,我正在显示给定订单的项目列表。当用户单击Add Item时,我重定向到Item/Create页面。此页面收集必要的输入,但还需要知道项目所属的订单id。将OrderID传递给Item/Create的适当方式是什么,以便在保存新创建的项时,它在表单post中仍然有效 我已经使用了TempData,并通过Html.Encode()将id写在详细信息页面上。它让我在某种程度上了解到,id显示在item表单上,但当表单提交和发布时,该值丢失。我想是因为它不是formcollection的一部分。我猜我的
...
<%= Html.ActionLink("Create New Item", "Create", "OrderItem", new { orderId = Model.ID }, null)%>
...
public ActionResult Create(int orderId)
{
ViewData["orderId"] = orderId;
return View();
}
...
<% using (Html.BeginForm(new { orderId = ViewData["orderId"] }))
...
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(int orderId)
{
// omitted code to create item, associated with orderId
return RedirectToAction("Details", "Order", new { orderId = orderId });
}
3)。创建视图:
...
<%= Html.ActionLink("Create New Item", "Create", "OrderItem", new { orderId = Model.ID }, null)%>
...
public ActionResult Create(int orderId)
{
ViewData["orderId"] = orderId;
return View();
}
...
<% using (Html.BeginForm(new { orderId = ViewData["orderId"] }))
...
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(int orderId)
{
// omitted code to create item, associated with orderId
return RedirectToAction("Details", "Order", new { orderId = orderId });
}
如果有人能想到如何改进这一点,或者想出一个更好的方法,请插话,我自己对这一点有点陌生,所以我想改进。我通过为包含OrderId的Item controller创建一个新路由来实现这一点。没有订单的项目没有意义,因此使用约束参数需要OrderId
routes.MapRoute(
"OrderItems",
"Item/{action}/{orderId}/{id}",
new { controller = "Item" },
new { orderId = @"d+" }
);
所以url看起来像http:///Item/Create/8
,其中8是要为其创建项目的OrderId。使用http:///Item/Delete/8/5
,其中8是订单ID,5是项目ID
您的操作方法如下所示:
public ActionResult Create(int orderId)
public ActionResult Delete(int orderId, int id)
routes.MapRoute(
"OrderItems",
"Order/{orderId}/Item/{action}/{id}",
new { controller = "Item" },
new { orderId = @"d+" }
);
<%= Html.Hidden("OrderID", Model.OrderID) %>
您还可以将其设置为使URL看起来像http:///Order/8/Item/Create
和http:///Order/8/Item/Delete/5
如果这似乎能更清楚地说明发生了什么
那么路线将如下所示:
public ActionResult Create(int orderId)
public ActionResult Delete(int orderId, int id)
routes.MapRoute(
"OrderItems",
"Order/{orderId}/Item/{action}/{id}",
new { controller = "Item" },
new { orderId = @"d+" }
);
<%= Html.Hidden("OrderID", Model.OrderID) %>
要往返于不属于正常数据输入的字段,我通常在视图中使用隐藏字段,如下所示:
public ActionResult Create(int orderId)
public ActionResult Delete(int orderId, int id)
routes.MapRoute(
"OrderItems",
"Order/{orderId}/Item/{action}/{id}",
new { controller = "Item" },
new { orderId = @"d+" }
);
<%= Html.Hidden("OrderID", Model.OrderID) %>
它看起来像表单字段,行为像表单字段,但用户看不到它。确保将正确的OrderID从控制器推送到模型中。Dennis-这看起来比我的想法要好得多。不过有一点需要澄清——如何获得orderId以在OrderItem控制器发布后继续有效。似乎它希望使用默认路由,而不是新创建的路由。[AcceptsVerbs(HttpVerbs.Post)]公共操作结果创建(FormCollection集合)确保OrderItems路由列在默认路由之前。这就不同了。此外,还需要在创建方法:[AcceptsVerbs(HttpVerbs.Post)]中包含orderId参数公共操作结果创建(int orderId,FormCollection集合),以便创建视图的表单Post url应包含/Order/8/Item/Create中的orderId