4

私は .net の経験がほとんどなく、MVC の学習を始めたばかりです。複数のコントローラーが見つかったという問題が発生しました。

「'reviews' という名前のコントローラーに一致する複数のタイプが見つかりました。これは、この要求 ('{controller}/{action}/{id}') を処理するルートが、一致するコントローラーを検索するための名前空間を指定していない場合に発生する可能性があります。この場合は、'namespaces' パラメーターを取る 'MapRoute' メソッドのオーバーロードを呼び出して、このルートを登録してください。"

最近、アプリに新しい「管理者」エリアを追加しました。その中に「ReviewController」があります。アプリのメイン フォルダ内には「ReviewController」もあります。

ああ - 新しいユーザーとして画像を投稿することはできませんが、基本的には "Controllers" と "Areas/Admin/Contollers" に "ReviewController" があります。

これまでに2つのルートを設定しました:

Global.asax.vb の既定のルート

  Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

     ' MapRoute takes the following parameters, in order: 
     ' (1) Route name
     ' (2) URL with parameters
     ' (3) Parameter defaults

     routes.MapRoute( _
       "Default", _
       "{controller}/{action}/{id}", _
       New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}, _
       {"PowellCasting/Controllers"}
     )

  End Sub

  Sub Application_Start()

    AreaRegistration.RegisterAllAreas()

    System.Data.Entity.Database.SetInitializer(New System.Data.Entity.DropCreateDatabaseIfModelChanges(Of Models.PowellCastingEntites))
    Database.SetInitializer(Of PowellCastingEntites)(New PowellCastingInitializer())

    RegisterGlobalFilters(GlobalFilters.Filters)
    RegisterRoutes(RouteTable.Routes)

    ControllerBuilder.Current.DefaultNamespaces.Add("PowellCasting/Controllers")

  End Sub

AdminAreaRegistration のエリア ルート

Namespace PowellCasting.Areas.Admin
  Public Class AdminAreaRegistration
    Inherits AreaRegistration

    Public Overrides ReadOnly Property AreaName() As String
      Get
        Return "Admin"
      End Get
    End Property

    Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)
      context.MapRoute( _
        "Admin_default", _
        "Admin/{controller}/{action}/{id}", _
         New With {.Controller = "Dashboard", .action = "Index", .id = UrlParameter.Optional}
       )
    End Sub
  End Class
End Namespace

私が抱えていた問題を読んだ後、いくつかのコードを追加しました。

管理コントローラに適切な名前空間が定義されている

  • 単なる PowellCasting ではなく、名前空間 PowellCasting.Areas.Admin。
  • グローバルに RegisterAllAreas を設定しました
  • ControllerBuilder.Current.DefaultNamespaces.Add("PowellCasting/Controllers") は、デフォルト ルートを指定するために用意されています。

私が今抱えている特定の問題は、「/Reviews」に移動すると、上記の複数のコントローラーエラーが発生することです。具体的には次のとおりです。

*「レビュー」のリクエストで、次の一致するコントローラーが見つかりました: PowellCasting.PowellCasting.Areas.Admin.ReviewsController

PowellCasting.PowellCasting.ReviewsController*

ルート デバッガーを有効にしましたが、1 つの一致のみが表示されます。

ああ - 新しいユーザーとして画像を投稿することはできませんが、次のように表示されます。

Admin/{controller}/{action}/{id} as FALSE

{controller}/{action}/{id} が TRUE の場合

これは予想どおりなので、なぜこの問題が発生するのかわかりません。

名前空間で maproute メソッドをオーバーロードすることについて読んだことがありますが、VB で例を見つけることができませんでした (c# でロード)。しかし、私はこれを試しました:

Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)
  context.MapRoute( _
      "Admin_default", _
     "Admin/{controller}/{action}/{id}", _
      New With {.Controller = "Dashboard", .action = "Index", .id = UrlParameter.Optional}, _
      vbNull,
      {"PowellCasting/Areas/Admin/Controllers"}
  )
End Sub

Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

' MapRoute takes the following parameters, in order: 
' (1) Route name
' (2) URL with parameters
' (3) Parameter defaults

routes.MapRoute( _
    "Default", _
    "{controller}/{action}/{id}", _
    New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}, _
    vbNull,
    {"PowellCasting/Controllers"}
)

End Sub

しかし、成功しませんでした。

これは簡単なはずだと確信しており、多くのことを試しましたが、非常にイライラします。どんな助けでも本当に感謝しています。

ここでの私の最初の投稿 - こんにちは!:)

4

3 に答える 3

5

表示されるエラー メッセージを注意深く読むと、次のようになります。

「レビュー」のリクエストで、次の一致するコントローラーが見つかりました: PowellCasting.PowellCasting.Areas.Admin.ReviewsController PowellCasting.PowellCasting.ReviewsController

PowellCasting2回繰り返されていることに気付くでしょう。

したがって、メインの Global.asax ルート登録では次のようになります。

routes.MapRoute( _
    "Default", _
    "{controller}/{action}/{id}", _
    New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}, _
    vbNull,
    {"PowellCasting.Controllers"}
)

ReviewControllerこれは、あなたのルートが次のように定義されていることを前提としています。

Namespace Controllers
    Public Class ReviewController
        Inherits System.Web.Mvc.Controller

        Function Index() As ActionResult
            Return View()
        End Function
    End Class
End Namespace

名前空間の定義にプレフィックスがないことに注意してPowellCastingください (これは、自動的に追加する VB のサブティリティです。アプリケーションの名前だと思います)。

および内部AdminAreaRegistration.vb

context.MapRoute( _
    "Admin_default", _
    "Admin/{controller}/{action}/{id}", _
    New With {.action = "Index", .id = UrlParameter.Optional}, _
    vbNull, _
    {"PowellCasting.Areas.Admin.Controllers"}
)

ReviewControllerこれは、この領域のあなたがそのように定義されていることを前提としています

Namespace Areas.Admin.Controllers
    Public Class ReviewController
        Inherits System.Web.Mvc.Controller

        Function Index() As ActionResult
            Return View()
        End Function
    End Class
End Namespace

PowellCasting名前空間の定義に接頭辞がないことにもう一度注意してください。

于 2011-09-14T23:13:59.260 に答える
0

私も同様の問題を抱えていました。

私は2つの領域を持っているアプリケーションを持っていました:共通、製品

そして、アプリケーションを開いたとき、Common_defaultルートが呼び出されていましたが、RoutesCollection.Routesを見ると、4つのルートが表示されました。実際、私は2つのルートのみを定義しました。1つは共通用、もう1つは製品用です。

上記のコメントを読んだ後、自分のWebサイトのプロジェクトプロパティを変更してみました。

デフォルトの名前空間を「MyWebsite.Web」から「MyWebsite」に変更しました。そして、それはトリックをしました。私のアプリケーションは稼働していました。

一番下の行に「。」が含まれることはありません。MVC4Webサイトプロジェクトのデフォルトの名前空間。

于 2013-03-07T16:24:43.290 に答える
0

DealerNetworksAreaRegistration.cs : //エリアを追加

context.MapRoute(
                "DealerNetworks_default",
                "DealerNetworks/{controller}/{action}/{id}",
                new { controller = "Dealer", action = "Index", id = UrlParameter.Optional }
            );

RouteConfig.cs

//Add Namespace

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional },
                //passing the namespace of the HomeController in the Main area using namespace parameter.
                namespaces: new[] { "SMART.Controllers" }
            ); 

Global.asax.cs

//Register Areas

AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();      
于 2013-10-12T02:57:57.170 に答える