有沒有辦法改變ASP.NET MVC中控制器的命名約定?更改ASP.NET MVC中的控制器名稱約定
我想要的是命名我的控制器InicioControlador
而不是InicioController
,或更好的方法是使用前綴而不是後綴,並將ControladorInicio
作爲我的控制器名稱。
從我目前閱讀的內容來看,我想我必須實現自己的控制器工廠。如果你們中的任何一位能夠指引我朝着正確的方向,我將非常感激。
有沒有辦法改變ASP.NET MVC中控制器的命名約定?更改ASP.NET MVC中的控制器名稱約定
我想要的是命名我的控制器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);
}
}
}