Asp.net mvc ASP.NET MVC基于主-明细关系创建

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的一部分。我猜我的

我正在显示给定订单的项目列表。当用户单击Add Item时,我重定向到Item/Create页面。此页面收集必要的输入,但还需要知道项目所属的订单id。将OrderID传递给Item/Create的适当方式是什么,以便在保存新创建的项时,它在表单post中仍然有效

我已经使用了TempData,并通过Html.Encode()将id写在详细信息页面上。它让我在某种程度上了解到,id显示在item表单上,但当表单提交和发布时,该值丢失。我想是因为它不是formcollection的一部分。我猜我的变通方法不是最好的方法,我想知道是否有人能在asp.net mvc中指出正确的方法

我使用了这个序列(如果有错误,很抱歉,我从一个工作示例中选取了这个序列,并根据您的问题对其进行了修改):

1)。详细信息视图(假设模型为订单类型):

...
<%= 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