105

というビューBrowse.chtmlがあり、ユーザーは検索語を入力するか、検索語を空白のままにできます。検索語を入力するときはページをhttp://localhost:62019/Gallery/Browse/{Searchterm} にリダイレクトし、何も入力されていないときはブラウザを にリダイレクトしたいhttp://localhost:62019/Gallery/Browse/Start/Here

これを試すと、次のエラーが表示されます。

コントローラー タイプ 'GalleryController' でのアクション 'Browse' の現在の要求は、次のアクション メソッド間であいまいです: System.Web.Mvc.ActionResult Browse(System.String) on type AutoApp_MVC.Controllers.GalleryController System.Web.Mvc.ActionResult Browse (Int32、System.String) タイプ AutoApp_MVC.Controllers.GalleryController

私がMVCでやっていることはすべて初めてです。この時点で他に何を試すべきかわかりません。

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult Browse(string name1, string name2)
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

これも Global.asax.cs にあります。

    routes.MapRoute(
         "StartBrowse",
         "Gallery/Browse/{s1}/{s2}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             s1 = UrlParameter.Optional,
             s2 = UrlParameter.Optional
         });



    routes.MapRoute(
         "ActualBrowse",
         "Gallery/Browse/{searchterm}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             searchterm=UrlParameter.Optional
         });
4

4 に答える 4

168

コントローラには、同じ名前のアクションメソッドを最大2つしか持つことができません。そのためには、1つがで[HttpPost]、もう1つがである必要があります[HttpGet]

どちらのメソッドもGETであるため、いずれかのアクションメソッドの名前を変更するか、別のコントローラーに移動する必要があります。

2つのBrowseメソッドは有効なC#オーバーロードですが、MVCアクションメソッドセレクターはどのメソッドを呼び出すかを判断できません。ルートをメソッドに一致させようとします(またはその逆)。このアルゴリズムは強く型付けされていません。

さまざまなアクションメソッドを指すカスタムルートを使用して、目的を達成できます。

...Global.asaxで

routes.MapRoute( // this route must be declared first, before the one below it
     "StartBrowse",
     "Gallery/Browse/Start/Here",
     new
     {
         controller = "Gallery",
         action = "StartBrowse",
     });

routes.MapRoute(
     "ActualBrowse",
     "Gallery/Browse/{searchterm}",
     new
     {
         controller = "Gallery",
         action = "Browse",
         searchterm = UrlParameter.Optional
     });

...そしてコントローラーで...

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult StartBrowse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

また、属性を1つに適用して区別することにより、コントローラーで同じ名前のアクションメソッドを維持できる場合があります。[ActionName]上記と同じGlobal.asaxを使用すると、コントローラーは次のようになります。

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

[ActionName("StartBrowse")]
public ActionResult Browse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}
于 2012-05-19T20:14:08.990 に答える
6

いつ質問されたのかわかりませんが、この解決策は利用可能でしたが、次のものを使用できます。

Request.QueryString["key"]

したがって、これは問題に対してうまくいくはずです:

[HttpGet]
public ActionResult Browse()
{
    if( Request.QueryString["id"] != null )        
        var summaries = /* search using id as search term */
    else /*assuming you don't have any more option*/
        var summaries = /* default list when nothing entered */

    return View(summaries);
} 
于 2015-08-17T15:34:17.800 に答える
1

要点は、リクエスト クラスを使用してクエリ文字列パラメーターを暗黙的にテストする必要がないということだと思います。

MVC がマッピングを行います (MVC ルートに重大な変更を加えていない限り)。

したがって、アクションリンクパス

/umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/

パラメーターが定義されていると、(サーフェス) コントローラーで自動的に使用できるようになります。

public ActionResult Logout(string DestinationUrl)

MVC が作業を行います。

于 2016-09-21T18:54:48.423 に答える