2009-06-04 66 views
5

我正在顯示給定訂單的項目列表。當用戶點擊添加項目時,我將重定向到項目/創建頁面。此頁面收集必要的輸入,但也需要知道該項目所屬的訂單ID。什麼是將OrderID傳遞給Item/Create的適當方式,以便在保存新創建的項目時能夠保留表單文章。在主從關係上創建ASP.NET MVC

我已經玩過TempData,並通過Html.Encode()在詳細信息頁面上編寫了id。它讓我在那裏的一部分,該ID顯示在項目表單上,但當表單提交和發佈時,該值會丟失。我想是因爲它不是表單集合的一部分。我猜我的解決方法不是最好的方法,並想知道是否有人可以指出在asp.net mvc中這樣做的正確方法。

回答

3

我這樣做是通過爲包含OrderId的Item控件創建一個新的路線。沒有訂單的商品沒有意義,所以使用約束參數需要OrderId。

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

所以URL看起來像http://<sitename>/Item/Create/8,其中8是將訂單爲其創建一個項目。對於使用http://<sitename>/Item/Delete/8/5刪除操作路由,可以執行類似的操作,其中8是OrderId,5是ItemId。

動作方法應該是這樣的:

public ActionResult Create(int orderId) 

public ActionResult Delete(int orderId, int id) 

你也可以設置它,這樣的URL看起來像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+" } 
); 
+0

丹尼斯 - 這看起來比我的想法更好。一個澄清雖然 - 我如何獲得OrderId以生存OrderItem控制器的職位。似乎它想要使用默認路由,而不是新創建的路由。 [AcceptsVerbs(HttpVerbs.Post)] public ActionResult Create(FormCollection集合) – etechpartner 2009-06-04 16:30:55

0

我用這個序列(抱歉,如果有錯誤,我把這個從一個工作示例,並修改了它爲你的問題):

1)在Order.Details視圖(假設模型的類型順序):

... 
<%= 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 }); 
} 

如果任何人能想到的如何改善這一點,或更好的方法,請加入,我自己對此有點新,所以我想改進。

0

要往返現場,這不是正常的數據條目的一部分,我通常使用隱藏字段在視圖中,類似這樣的:

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

它看起來像一個表單域,就像一個表單域,但用戶看不到它。確保從控制器中將正確的OrderID推入模型中。