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

mkl*_*ein 0 asp.net-mvc asp.net-mvc-3

想象一下以下控制器方法:

public ActionResult ShipmentDetails(Order order)
{
    return View(new OrderViewModel { Order = order });
}
Run Code Online (Sandbox Code Playgroud)

传入订单参数从自定义模型绑定器填充,该绑定器为该会话创建新订单并将其存储在会话中,或者重用当前会话中的现有订单.此订单实例现在用于填写货件详细信息表单,用户可以在其中输入其地址等.

@using(Html.BeginForm())在视图中使用时.我不能再对post方法使用相同的签名(因为这会导致模板的方法名称),我发现我添加了一个伪参数,只是为了使这个工作.

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

   return RedirectToAction("Initialize", order.PaymentProcessorTyped + "Checkout");
}
Run Code Online (Sandbox Code Playgroud)

这方面的最佳做法是什么?您是否只需将方法重命名为类似的PostShipmentDetails()并使用其中一个重载BeginForm?或者问题源自于第一种方法是否具有订单参数?

Dar*_*rov 5

您可以使用ActionName属性:

[HttpPost]
[ActionName("ShipmentDetails")]
public ActionResult UpdateShipmentDetails(Order order) { ... }
Run Code Online (Sandbox Code Playgroud)

或者更经典的模式:

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");
}
Run Code Online (Sandbox Code Playgroud)