1

MVCアクションをオーバーロードしようとしていますが、ルートアクションでは「オーバーロード」が機能しないため(エラー500は、ブラウザーからパラメーターを強く入力できないため、あいまいなメソッドを示していると思います)、あるアクションを別のアクションに戻すだけだと思いました。 HttpPostにもRedirectToActionを使用できないためです。問題は、私が呼び出そうとしているアシトンではなく、新しいアクション名でビューを見つけようとしていることです。これが私がやろうとしていることです:

    [HttpPost]
    public ActionResult DetailForProductID(int productID)
    {
        return Detail(new[] { GetProductById(productID) });
    }

    [HttpPost]
    public ActionResult Detail(IEnumerable<Product> products)
    {
       ....
       return View(productViewModel);
    }

これは私が得るエラーです:

The view 'DetailForProductID' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Products/DetailForProductID.aspx
~/Views/Products/DetailForProductID.ascx
~/Views/Shared/DetailForProductID.aspx
~/Views/Shared/DetailForProductID.ascx
~/Views/Products/DetailForProductID.cshtml
~/Views/Products/DetailForProductID.vbhtml
~/Views/Shared/DetailForProductID.cshtml
~/Views/Shared/DetailForProductID.vbhtml

これを処理するための最も堅牢でエレガントな方法は何ですか?サーバー側ですべてを実行できるはずなので、一時的なセッションに保存したり、RedirectToActionを実行したりしたくありません。どんな助けやアドバイスも大歓迎です。

4

3 に答える 3

3

そのようなリダイレクトには、次のことをお勧めします。

return RedirectToAction("Detail", data);

しかし、なぜあなたがこれを必要としているのかわかりません。あなたの行動を見て、代わりにこのようにしてみませんか?

public ActionResult Detail(int productId)
{
   var data = GetProductById(productID);
   ....
   return View(productViewModel);
}
于 2012-08-10T16:18:13.857 に答える
1

このシナリオでは、次のようにTempdataを使用することもできます。

public ActionResult DetailForProductID(int productID)
{
    IEnumerable<Product> data =   GetProductById(productID);
    TempData["ProductData"]= data;
    return RedirectToAction("Detail",data);        
}


public ActionResult Detail(IEnumerable<Product> products)
{
   ....
    if(TempData["ProductData"]!=null){
       IEnumerable<Product> data =  (IEnumerable<Product>)TempData["ProductData"];
       return View(data);
    }else {
       return View(products);
    }
}
于 2012-08-10T16:27:09.250 に答える
0

コントローラーを「薄く」「ダム」に保つことが重要だと思います。単純なWebサイトを超えて、より複雑なものを構築する必要がある場合は、同じコードを何度も書き直す必要はありません(多くの理由で良くありません)。また、コントローラーをジェネリック関数として使用することもできなくなります(これは基本的に現在実行しようとしていることです)。

これを処理するためのよりエレガントで堅牢な方法は、アプリケーションロジックを抽象化し、別の場所で実行することです。次に、アクションの要件に応じてロジックの一部を呼び出すことができます。その方向に移動を開始するには、各コントローラーにコントローラー固有のロジックを記述し、両方のコントローラー間で共有される関数を決定して、プロジェクト内の別の場所に配置します。より複雑なプロジェクトでは、コントローラーにアプリケーションロジックがまったくないことも珍しくありません。

おそらくIdによって「Product」を返す1つのジェネリック関数を作成し、その関数を別の場所に配置することをお勧めします。次に、コントローラーを使用して特定のロジックを決定し、共有関数を呼び出してIDで製品を取得します。

于 2012-08-10T16:47:23.313 に答える