我正在显示给定订单的商品列表。当用户单击“添加项目”时,我会重定向到“项目/创建”页面。此页面收集必要的输入,但也需要知道该项目所属的订单ID。将OrderID传递给Item / Create的适当方法是什么,以便在保存新创建的项目时它能够在表单发布后保留。
我玩过TempData并通过Html.Encode()在详细页面上写出id。它让我在那里的一部分方式是id显示在项目表单上,但是当表单提交和发布时,值会丢失。我想因为它不是形式收集的一部分。我猜测我的解决方法不是最好的方法,并且想知道是否有人可以指出在asp.net mvc中执行此操作的正确方法。
答案 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/Create
和http://<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推送到模型中。