【问题标题】:ASP NET MVC Area routing/multiple routes issue in VBVB 中的 ASP NET MVC 区域路由/多路由问题
【发布时间】:2011-11-17 10:43:34
【问题描述】:

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

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

我最近在我的应用程序中添加了一个新的“管理”区域,其中我有一个“ReviewController”。主应用文件夹中还有一个“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.Areas.Admin 而不是简单的 PowellCasting。
  • 我在全局中设置了 RegisterAllAreas
  • ControllerBuilder.Current.DefaultNamespaces.Add("PowellCasting/Controllers") 用于指定默认路由。

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

*“reviews”请求找到了以下匹配的控制器: 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

但没有成功。

我确信这应该很简单,而且我已经尝试了很多方法 - 这非常令人沮丧。任何帮助将不胜感激。

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

【问题讨论】:

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


    【解决方案1】:

    如果您仔细阅读您收到的错误消息:

    “评论”请求找到了以下匹配项 控制器: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 subtility,我想这是您的应用程序的名称)

    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 前缀。

    【讨论】:

    • 感谢您的快速回复 - 这很有效! :) 我仍在努力解决这一切,但它开始变得有意义了。我尝试转到“/admin”,但失败了,但它也归结为包含“PowellCasting”的命名空间。一旦我把它拿出来,它也能正常工作。再次感谢您的帮助。
    【解决方案2】:

    我也有类似的问题。

    我有一个应用程序,我有两个领域:通用,产品

    当我打开应用程序时,Common_default 路由被调用,但是当我看到 RoutesCollection.Routes 时,它显示了 4 条路由。实际上我只定义了 2 条路线 - 一条用于 common ,一条用于 Products。

    在阅读了上面的 cmets 之后,我只是尝试更改我的网站的项目属性。

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

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

    【讨论】:

      【解决方案3】:

      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();      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 2021-03-03
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多