ASP.NET MVC在主 - 细节关系上创建

时间:2009-06-04 00:37:49

标签: asp.net-mvc

我正在显示给定订单的商品列表。当用户单击“添加项目”时,我会重定向到“项目/创建”页面。此页面收集必要的输入,但也需要知道该项目所属的订单ID。将OrderID传递给Item / Create的适当方法是什么,以便在保存新创建的项目时它能够在表单发布后保留。

我玩过TempData并通过Html.Encode()在详细页面上写出id。它让我在那里的一部分方式是id显示在项目表单上,但是当表单提交和发布时,值会丢失。我想因为它不是形式收集的一部分。我猜测我的解决方法不是最好的方法,并且想知道是否有人可以指出在asp.net mvc中执行此操作的正确方法。

3 个答案:

答案 0 :(得分:3)

我是通过为包含OrderId的Item控制器创建新路由来实现的。没有Order的Item是没有意义的,所以使用constraints参数需要OrderId。

routes.MapRoute(
    "OrderItems",
    "Item/{action}/{orderId}/{id}",
    new { controller = "Item" },
    new { orderId = @"d+" }
);

因此,网址看起来像http://<sitename>/Item/Create/8,其中8是要为其创建项目的OrderId。使用http://<sitename>/Item/Delete/8/5删除行动路线可以做类似的事情,其中​​8是OrderId,5是ItemId。

您的Action方法如下所示:

public ActionResult Create(int orderId)

public ActionResult Delete(int orderId, int id)

你也可以设置它,以便网址看起来像http://<sitename>/Order/8/Item/Createhttp://<sitename>/Order/8/Item/Delete/5,如果这似乎更清楚地显示了正在发生的事情。

然后路线看起来像这样:

routes.MapRoute(
    "OrderItems",
    "Order/{orderId}/Item/{action}/{id}",
    new { controller = "Item" },
    new { orderId = @"d+" }
);

答案 1 :(得分:0)

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

1)在Order.Details视图中(假设Model的类型为Order):

...
<%= Html.ActionLink("Create New Item", "Create", "OrderItem", new { orderId = Model.ID }, null)%>
...

2)在OrderItem.Create操作中:

public ActionResult Create(int orderId)
{
    ViewData["orderId"] = orderId;
    return View();
}

3)在OrderItem.Create视图中:

...
<% using (Html.BeginForm(new { orderId = ViewData["orderId"] }))
...

4)在OrderItem.Create POST操作中:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(int orderId)
{
    // omitted code to create item, associated with orderId

    return RedirectToAction("Details", "Order", new { orderId = orderId });
}

如果有人能想到如何改进这一点,或者更好地改善这种方式,那么请加入,我对此有点新鲜,所以我想改进。

答案 2 :(得分:0)

要往返一个不属于正常数据条目的字段,我通常在视图中使用隐藏字段,如下所示:

<%= Html.Hidden("OrderID", Model.OrderID) %>

它看起来像一个表单字段,就像表单字段一样,但是用户看不到它。确保从控制器将正确的OrderID推送到模型中。