[MVC]如何提升命名空间的优先级
应用于mvc同一个项目中拥有两个及多个同名Controller时,如何定义其执行顺序问题!
如上图所示,在默认情况下,运行项目会报如下错误:
这种情况我们需要做的是在路由注册类中将路由添加上它的命名空间;让其与其它的Controller进行区分;这样使其在解析路由的时候通过命名空间找到需要执行的Controller;代码如下:
1 routes.MapRoute(
2 name: "Default", // 路由名称
3 url:"{controller}/{action}/{id}", // 带有参数的 URL
4 defaults:new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值
5 namespaces: new string[] { "Dacai.CMS.Controllers" }
6 );
2 name: "Default", // 路由名称
3 url:"{controller}/{action}/{id}", // 带有参数的 URL
4 defaults:new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值
5 namespaces: new string[] { "Dacai.CMS.Controllers" }
6 );
这种情况适用于不同Controller文件的情况; 还有一种情况就是在同一个Controller文件中定义了两个或多个同名Controller类及相同的Action但不同命名空间,则我们就需要在
Global.asax中通过ControllerBuilder类去处理Controller的执行优先级;
namespace 如何提升命名空间的优先级.c.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return this.Content(this.GetType().FullName);
}
}
}
namespace 如何提升命名空间的优先级.c
{
public class HomeController:Controller
{
public ActionResult Index()
{
return this.Content(this.GetType().FullName);
}
}
}
{
public class HomeController : Controller
{
public ActionResult Index()
{
return this.Content(this.GetType().FullName);
}
}
}
namespace 如何提升命名空间的优先级.c
{
public class HomeController:Controller
{
public ActionResult Index()
{
return this.Content(this.GetType().FullName);
}
}
}
View Code
1 protected void Application_Start()
2 {
3 AreaRegistration.RegisterAllAreas();
4 ControllerBuilder.Current.DefaultNamespaces.Add("如何提升命名空间的优先级.c");
5 //ControllerBuilder.Current.DefaultNamespaces.Add("如何提升命名空间的优先级.c.Controllers");
6
7 // Use LocalDB for Entity Framework by default
8 Database.DefaultConnectionFactory = new SqlConnectionFactory("Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");
9
10 RegisterGlobalFilters(GlobalFilters.Filters);
11 RegisterRoutes(RouteTable.Routes);
12 }
2 {
3 AreaRegistration.RegisterAllAreas();
4 ControllerBuilder.Current.DefaultNamespaces.Add("如何提升命名空间的优先级.c");
5 //ControllerBuilder.Current.DefaultNamespaces.Add("如何提升命名空间的优先级.c.Controllers");
6
7 // Use LocalDB for Entity Framework by default
8 Database.DefaultConnectionFactory = new SqlConnectionFactory("Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");
9
10 RegisterGlobalFilters(GlobalFilters.Filters);
11 RegisterRoutes(RouteTable.Routes);
12 }