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 ではサポートされていません。ディスパッチャーは、2 つのアクションの違いを認識できません。これを回避するには、アクションの[HttpGet]1 つに属性を指定し、もう 1 つのアクションに属性を指定し[HttpPost]ます。

それができない場合 (または 3 つ以上のオーバーロードがある場合) は、オブジェクト パラメーターを使用し、実行時の型識別を使用して、呼び出す正しい関数を選択することにより、いつでも自分でアクションをディスパッチできます。例えば:

[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

コントローラーでそれを行うことはできません。2 番目のメソッド名を変更する必要があります。

[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 (アクション引数オブジェクトを構築する責任がある) ModelBinder に「問い合わせる」必要があるため、ActionInvoker (actionsn を呼び出すためにコントローラー基本クラス内で使用されるクラス) が呼び出すメソッドを決定できないためです。渡された HTTP 要求から ModelBinder がその引数オブ​​ジェクトを構築できる場合は、オーバーロードします。単純なシナリオではこれは機能しますが、より複雑なシナリオでは失敗します。これは、ModelBinder が複数のオーバーロードの引数のバインドに成功するためです。ASP.NET MVC でオーバーロードを許可しないことは、非常に賢明な設計上の決定です。

問題を解決するには、ItemUpdateHTTP GET アクションを修正して、2 番目のアクションを残してアクションを 1 つだけにすることができます。ModelBinder は、たとえば URL パラメーターとして渡される値が か かどうかを気にしないためstringですint

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

HTTP POST バージョンについてはItemUpdate、これらのアクションのいずれかの名前を変更するか、1 つのアクションのみをリスト バージョンに変更することをお勧めしORDERますORDER

于 2012-07-18T19:45:00.223 に答える