我对.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.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
但没有成功。
我确信这应该是直截了当的,我尝试过很多东西 - 非常令人沮丧。任何帮助都会非常感激。
我在这里的第一篇文章 - 嗨! :)
答案 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();