ASP NET MVC区域路由/ VB中的多个路由问题

时间:2011-09-14 22:54:47

标签: asp.net-mvc vb.net routes areas asp.net-mvc-3-areas

我对.net缺乏经验,刚刚开始学习MVC。我遇到了一个关于找到多个控制器的问题:

“找到了与名为'reviews'的控制器匹配的多个类型。如果为此请求提供服务的路由('{controller} / {action} / {id}')未指定名称空间,则会发生这种情况。搜索与请求匹配的控制器。如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由。“

我最近在我的应用中添加了一个新的“管理”区域,其中我有一个“ReviewController”。主app文件夹中还有一个“ReviewController”:

啊 - 作为新用户,我无法发布图像,但基本上我在“控制器”和“区域/管理员/控制器”中都有“ReviewController”。

到目前为止我设置了两条路线:

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.Areas.Admin而不仅仅是PowellCasting。
  • 我在全局
  • 中设置了RegisterAllAreas
  • ControllerBuilder.Current.DefaultNamespaces.Add(“PowellCasting / Controllers”)用于指定默认路由。

我现在遇到的具体问题是,当我转到“/评论”时,我得到上面显示的多个控制器错误,具体来说:

*“评论”请求找到了以下匹配的控制器: PowellCasting.PowellCasting.Areas.Admin.ReviewsController

PowellCasting.PowellCasting.ReviewsController *

我启用了路由调试器并且只显示了一个匹配项:

啊 - 作为新用户,我无法发布图片但显示:

Admin / {controller} / {action} / {id}为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

但没有成功。

我确信这应该是直截了当的,我尝试过很多东西 - 非常令人沮丧。任何帮助都会非常感激。

我在这里的第一篇文章 - 嗨! :)

3 个答案:

答案 0 :(得分:5)

如果您仔细阅读了错误消息:

  

“评论”请求找到了以下匹配项   控制器:PowellCasting.PowellCasting.Areas.Admin.ReviewsController   PowellCasting.PowellCasting.ReviewsController

您会注意到PowellCasting重复两次。

所以在您的主要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前缀。

答案 1 :(得分:0)

我也有类似的问题。

我有一个应用程序,我有两个区域:Common,Products

当我打开应用程序时,正在调用Common_default路由,但是当我看到RoutesCollection.Routes时,它显示了4条路由。实际上我只定义了两条路线 - 一条用于普通路线,一条用于产品。

阅读完上述评论后,我试着改变我网站的项目属性。

我将默认命名空间从“MyWebsite.Web”更改为“MyWebsite”。它成功了。我的应用已启动并正在运行。

底线永远不会有“。”在MVC4网站项目的默认命名空间中。

答案 2 :(得分: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();