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

ete*_*ner 5 asp.net-mvc

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

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

Cod*_*nis 3

我通过为包含 OrderId 的 Item 控制器创建新路由来实现此目的。没有订单的项目是没有意义的,因此需要使用约束参数来提供 OrderId。

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

因此 url 看起来像http://<sitename>/Item/Create/8,其中 8 是要为其创建项目的 OrderId。可以对带有 的删除操作路由执行类似的操作http://<sitename>/Item/Delete/8/5,其中 8 是 OrderId,5 是 ItemId。

您的操作方法将如下所示:

public ActionResult Create(int orderId)

public ActionResult Delete(int orderId, int id)
Run Code Online (Sandbox Code Playgroud)

您还可以对其进行设置,使网址看起来像这样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+" }
);
Run Code Online (Sandbox Code Playgroud)