2011-01-10 104 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