2011-01-10 191 views
0

圖片下面的控制器方法:在ASP.NET MVC控制器方法Ambigious名

public ActionResult ShipmentDetails(Order order) 
{ 
    return View(new OrderViewModel { Order = order }); 
} 

傳入訂單參數從自定義模型粘合劑填補,要麼創造了本次會議,並將其存儲新秩序在會議中,或重新使用當前會話中的現有訂單。此訂單實例現在用於填寫貨件詳細信息表單,用戶可以在其中輸入地址等。

在視圖中使用@using(Html.BeginForm())時。我不能再次使用相同的簽名爲post方法(因爲這會導致方法名稱不明確),我發現我添加了一個虛擬參數來完成這項工作。

[HttpPost] 
public ActionResult ShipmentDetails(Order order, object dummy) 
{ 
    if (!ModelState.IsValid) 
     return RedirectToAction("ShipmentDetails"); 

    return RedirectToAction("Initialize", order.PaymentProcessorTyped + "Checkout"); 
} 

這是什麼最佳實踐?你會簡單地將該方法重命名爲PostShipmentDetails(),並使用BeginForm的重載之一?或者問題是從這一點出發的,第一種方法是否有順序參數?

回答

5

您可以使用ActionName attribuite:

[HttpPost] 
[ActionName("ShipmentDetails")] 
public ActionResult UpdateShipmentDetails(Order order) { ... } 

或更經典模式:

public ActionResult ShipmentDetails(int orderId) 
{ 
    var order = Repository.GetOrder(orderId); 
    return View(new OrderViewModel { Order = order }); 
} 

[HttpPost] 
public ActionResult ShipmentDetails(Order order) 
{ 
    if (!ModelState.IsValid) 
     return RedirectToAction("ShipmentDetails"); 

    return RedirectToAction("Initialize", order.PaymentProcessorTyped + "Checkout"); 
} 
+0

我不知道該ActionNameAttribute。感謝您指出。 – mklein 2011-01-10 22:04:37