我对。net非常缺乏经验,刚刚开始学习MVC。我遇到了一个关于发现多个控制器的问题:
"发现多个类型匹配名为'reviews'的控制器。如果服务此请求的路由('{controller}/{action}/{id}')没有指定名称空间来搜索与请求匹配的控制器,就会发生这种情况。如果是这种情况,通过调用带有"namespaces"参数的"MapRoute"方法的重载来注册这条路由。"
我最近添加了一个新的"管理"区域到我的应用程序,我有一个"ReviewController"。在主应用程序文件夹中也有一个"ReviewController":
啊-作为一个新用户,我不能发布图像,但基本上我在"控制器"one_answers"区域/管理/控制器"中有一个"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
adminareareregistration中的区域路由
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
在阅读了我所遇到的问题之后,我添加了一些代码:
我的Admin控制器定义了正确的命名空间
- 命名空间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
但没有成功。
我相信这应该是直截了当的,我已经尝试了很多事情-它非常令人沮丧。如有任何帮助,我将不胜感激。
我在这里的第一个帖子-嗨!:)
如果你仔细阅读你得到的错误信息:
对'reviews'的请求已找到以下匹配控制器:PowellCasting.PowellCasting.Areas.Admin.ReviewsControllerPowellCasting.PowellCasting.ReviewsController
你会注意到PowellCasting
重复了两次。
在你的main 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
前缀。
我也遇到过类似的问题。
我有一个应用程序,其中有两个区域:Common, Products
当我打开应用程序时,Common_default路由被调用了,但是当我看到RoutesCollection的时候。路线,它显示了4条路线。实际上我只定义了两条路由——一条用于common,一条用于product。
看了上面的评论,我只是给了它一个尝试,我改变我的网站项目属性。
我将默认命名空间从"MyWebsite"更改为"MyWebsite"。转到"我的网站"。它确实奏效了。我的应用程序已经启动并运行。
底线是永远不要在你的MVC4网站项目的默认命名空间中有"."
dealernetworksareareregistration .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();