Asp.net mvc 更改ASP.NET MVC中的控制器名称约定
有没有办法更改ASP.NET MVC中控制器的命名约定 我想要的是将我的控制器命名为Asp.net mvc 更改ASP.NET MVC中的控制器名称约定,asp.net-mvc,controller,prefix,Asp.net Mvc,Controller,Prefix,有没有办法更改ASP.NET MVC中控制器的命名约定 我想要的是将我的控制器命名为InicioControlador而不是InicioController,或者更好的是,使用前缀而不是后缀,并将ControladorInicio作为我的控制器名称 从目前为止我所读到的,我认为我必须实现我自己的控制器工厂。如果你们能为我指出正确的方向,我将不胜感激。是的,ControllerFactory是解决您问题的最佳方案 public IController CreateController(Reques
InicioControlador
而不是InicioController
,或者更好的是,使用前缀而不是后缀,并将ControladorInicio
作为我的控制器名称
从目前为止我所读到的,我认为我必须实现我自己的控制器工厂。如果你们能为我指出正确的方向,我将不胜感激。是的,ControllerFactory是解决您问题的最佳方案
public IController CreateController(RequestContext requestContext, string controllerName)
{
BaseController controller;
switch (controllerName.ToLower())
{
case "product": case "products": controller = new MyProductController(); break;
case "home": controller = new MyHomeController(); break;
case "account": controller = new MyAccountController(); break;
default: controller = null; break;
}
return controller;
}
这是我的第一个ControllerFactory-但它非常愚蠢:)你必须使用反射并避免这个丑陋的切换。我决定深入挖掘,在搜索MVC源代码后找到了我想要的东西。控制器名称的约定深入到MVC框架的根中,特别是在两个类中
ControllerDescriptor
和ControllerTypeCache
在ControllerDescriptor
中,它由以下属性给出:
public virtual string ControllerName {
get {
string typeName = ControllerType.Name;
if (typeName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) {
return typeName.Substring(0, typeName.Length - "Controller".Length);
}
return typeName;
}
}
在ControllerTypeCache
中,通过以下方法给出:
internal static bool IsControllerType(Type t) {
return
t != null &&
t.IsPublic &&
t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) &&
!t.IsAbstract &&
typeof(IController).IsAssignableFrom(t);
}
public void EnsureInitialized(IBuildManager buildManager)
{
if (_cache == null)
{
lock (_lockObj)
{
if (_cache == null)
{
List<Type> controllerTypes = TypeCacheUtil.GetFilteredTypesFromAssemblies(_typeCacheName, IsControllerType, buildManager);
var groupedByName = controllerTypes.GroupBy(
t => t.Name.Substring(0, t.Name.Length - "Controller".Length),
StringComparer.OrdinalIgnoreCase);
_cache = groupedByName.ToDictionary(
g => g.Key,
g => g.ToLookup(t => t.Namespace ?? String.Empty, StringComparer.OrdinalIgnoreCase),
StringComparer.OrdinalIgnoreCase);
}
}
}
内部静态bool ISCONTROLLER类型(t型){
返回
t!=null&&
t、 公开的&&
t、 Name.EndsWith(“控制器”,StringComparison.OrdinalIgnoreCase)&&
!t.IsAbstract&&
类型(i控制器)。可从(t)中指定;
}
重新初始化的公共文件(IBuildManager buildManager)
{
如果(_cache==null)
{
锁
{
如果(_cache==null)
{
List controllerTypes=TypeCacheUtil.GetFilteredTypesFromAssemblies(\u typeCacheName,IsControllerType,buildManager);
var groupedByName=controllerTypes.GroupBy(
t=>t.Name.Substring(0,t.Name.Length—“Controller.Length”),
普通木糖酶);
_cache=groupedByName.ToDictionary(
g=>g.键,
g=>g.ToLookup(t=>t.Namespace??String.Empty,StringComparer.OrdinalIgnoreCase),
普通木糖酶);
}
}
}