我们可以使用 HTML 视图的默认文件夹约定的 MVC 应用程序,但我们希望设置备用“服务”文件夹,其中控制器仅用于返回 xml 或 json 的 Web 服务。
所以路由“/Services/Tasks/List”会被路由到“/Services/TaskService.cs”,而“/Tasks/List”会被路由到标准的“/Controllers/TaskController.cs”
我们希望将服务控制器与视图控制器分开。我们不认为区域或使用另一个项目会起作用。解决这个问题的最佳方法是什么?
我们可以使用 HTML 视图的默认文件夹约定的 MVC 应用程序,但我们希望设置备用“服务”文件夹,其中控制器仅用于返回 xml 或 json 的 Web 服务。
所以路由“/Services/Tasks/List”会被路由到“/Services/TaskService.cs”,而“/Tasks/List”会被路由到标准的“/Controllers/TaskController.cs”
我们希望将服务控制器与视图控制器分开。我们不认为区域或使用另一个项目会起作用。解决这个问题的最佳方法是什么?
您可以使用路由来执行此操作,并将控制器保存在单独的命名空间中。MapRoute 允许您指定哪个命名空间对应于路由。
例子
鉴于此控制器
namespace CustomControllerFactory.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return new ContentResult("Controllers");
}
}
}
namespace CustomControllerFactory.ServiceControllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return new ContentResult("ServiceControllers");
}
}
}
以及以下路由
routes.MapRoute(
"Services",
"Services/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "CustomControllerFactory.ServiceControllers" } // Namespace
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "CustomControllerFactory.Controllers"} // Namespace
);
您应该期待以下响应
/服务/首页
服务控制器
/家
控制器
在 Asp.Net Core 中:我使用了 AreaFeature 库ServiceCollectionExtensions
首先设置你的中间件;
services.AddMvc(options =>
options.EnableEndpointRouting = false).
AddFeatureFolders().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Latest);
在扩展中:
return AddFeatureFolders(services, new FeatureFolderOptions());
根据您的要求实施:
public static IMvcBuilder AddFeatureFolders(this IMvcBuilder services, FeatureFolderOptions options)
{
if (services == null)
throw new ArgumentNullException(nameof(services));
if (options == null)
throw new ArgumentException(nameof(options));
var expander = new FeatureViewLocationExpander(options);
services.AddMvcOptions(o => o.Conventions.Add(new FeatureControllerModelConvention(options)))
.AddRazorOptions(o =>
{
o.ViewLocationFormats.Clear();
o.ViewLocationFormats.Add(options.FeatureNamePlaceholder + @"\{0}.cshtml");
o.ViewLocationFormats.Add(options.FeatureNamePlaceholder + @"\_Views\{0}.cshtml");
o.ViewLocationFormats.Add(options.FeatureFolderName + @"\Shared\{0}.cshtml");
o.ViewLocationFormats.Add(options.DefaultViewLocation);
o.ViewLocationExpanders.Add(expander);
});
return services;
}
在我的情况下,我更喜欢使用单独的 _View 文件夹来查看功能文件夹中的视图
~/Features/Account/_Views/login.cshtml
~/Features/Account/AccountController.cs
~/Features/Account/AccountModel.cs
您需要创建自己的控制器工厂来实现 IControllerFactory。
查看http://nayyeri.net/custom-controller-factory-in-asp-net-mvc以获取示例。
如果您看到黄色文件夹名称在根目录中添加文件夹名称
之后,您必须将 routes.MapRoute 修改为“App_Start > RouteConfig”
修改默认路由
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "mvcPartialView.HomeController" } // Namespace
);
并添加这个
routes.MapRoute(
"ApiControllerOne", // Name of folder
"ApiControllerOne/{controller}/{action}/{id}",
new { controller = "ApiFactory", action = "callFactoryOne", id = UrlParameter.Optional },
new string[] { "mvcPartialView.ApiControllerOne" } // Namespace
);