ASP.NET MVC中控制器方法的Ambigious名称

时间:2011-01-10 20:38:58

标签: asp.net-mvc asp.net-mvc-3

想象以下控制器方法:

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的重载之一?或者问题源自于第一种方法是否具有订单参数?

1 个答案:

答案 0 :(得分:5)

您可以使用ActionName属性:

[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");
}