4

可能重复:
您可以在 ASP.Net MVC 中重载控制器方法吗?

我需要 2 种采用不同类型参数的方法。所以我尝试了这个,

[HttpPost]
public ActionResult ItemUpdate(ORDER ln)
{
   // do something
}

[HttpPost]
public ActionResult ItemUpdate(List<ORDER> lns)
{
  // Do Something
}

但它不起作用。

编译的时候没有报错,但是运行的时候就报错了。

我如何编写代码以使其正常工作?

谢谢!

[编辑]

[HttpGet]
public ActionResult ItemUpdate(string name)
{
    return Content(name);
}

[HttpGet]
public ActionResult ItemUpdate(int num)
{
    return Content(num.ToString());
}

当我调用 /Test/ItemUpdate/

它会出错,

Server Error in '/' Application.
The current request for action 'ItemUpdate' on controller type 'OrderController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult ItemUpdate(System.String) on type Ecom.WebUI.Controllers.OrderController
System.Web.Mvc.ActionResult ItemUpdate(Int32) on type Ecom.WebUI.Controllers.OrderController 

[编辑]

它与 ORDER 甚至单个参数都不匹配。

if (lns.GetType() == typeof(ORDER))
{
  // always false
}else{
  // also I can not cast the object.
  ORDER ln = (ORDER)lns; //Unable to cast object of type 'System.Object' to type 'ORDER'
}
4

4 回答 4

2

MVC 不支持重载操作。调度员无法分辨这两个 Action 之间的区别。您可以通过为您的一项操作指定[HttpGet]属性和另一项指定[HttpPost]属性来解决此问题。

如果这不是一个选项(或者如果您有三个或更多重载),您始终可以自己调度 Action,方法是使用对象参数并使用运行时类型标识来选择要调用的正确函数。例如:

[HttpPost]
public ActionResult ItemUpdate(object arg)
{
    if (arg.GetType() == typeof(ORDER))
    {
        return ItemUpdateOrder((Order)arg);
    }
    else if (arg.GetType() == typeof(List<ORDER>))
    {
        return ItemUpdateList((List<Order>)arg);
    }
}

public ActionResult ItemUpdateOrder(ORDER ln)
{
    //...
}

public ActionResult ItemUpdateList(List<ORDER> lns)
{
    //...
}
于 2012-07-18T19:28:45.460 回答
1

你不能在控制器中这样做。您将不得不更改第二个方法名称。

[HttpPost]
public ActionResult ItemUpdates(List<ORDER> lns)
{
  // Do Something
}
于 2012-07-18T18:50:49.943 回答
0
public ActionResult ItemUpdates(object myInputValue)
{
    if (myInputValue.GetType() == typeof(string)
    // Do something
    else if (myInputValue.GetType() == typeof(List<ORDER>))
    // Do something else
}

然后,您可以将对象转换为您选择的类型并正常操作。

于 2012-07-18T19:29:51.853 回答
0

在 ASP.NET 中,不可能有没有ActionFilter属性的重载方法来区分这些操作。这样做的原因是 ActionInvoker(在 Controller 基类中用于调用 actiosn 的类)无法确定调用哪个方法,因为它需要为每个如果 ModelBinder 可以从传递的 HTTP 请求构造该参数对象,则重载。对于简单的场景,这会起作用,但在更复杂的场景中,这会失败,因为 ModelBinder 将成功绑定多个重载的参数。在 ASP.NET MVC 中不允许重载是非常聪明的设计决定。

为了解决您的问题,您可以ItemUpdate通过仅保留第二个操作并仅执行一个操作来修复 HTTP GET 操作,因为 ModelBinder 不介意作为 URL 参数传递的值是 astring还是int.

[HttpGet]
public ActionResult ItemUpdate(string name)
{
    return Content(name);
}

对于ItemUpdateHTTP POST 版本,我建议重命名这些操作之一或只有一个操作,列表版本,因为更新单个ORDER只是更新多个ORDER对象的特定情况。

于 2012-07-18T19:45:00.223 回答