我们可以使用HTML视图的默认文件夹约定的MVC应用程序,但是我们想要设置备用“服务”文件夹,其中控制器仅用于返回xml或json的Web服务。
因此路由“/ Services / Tasks / List”将路由到“/Services/TaskService.cs”,而“/ Tasks / List”将路由到标准“/Controllers/TaskController.cs"
我们希望将服务控制器与视图控制器分开。我们认为区域或使用其他项目不会起作用。什么是最好的方法来解决这个问题?
答案 0 :(得分:10)
您可以使用“路由”执行此操作,并将控制器保留在单独的命名空间中。 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
);
您应该期待以下回复
/服务/主页
的ServiceController
/主页
控制器
答案 1 :(得分:1)
在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
答案 2 :(得分:0)
您需要创建自己的控制器工厂,实现IControllerFactory。
查看http://nayyeri.net/custom-controller-factory-in-asp-net-mvc以获取示例。
答案 3 :(得分:0)
如果看到黄色文件夹名称 在根目录中添加文件夹名称
之后,您必须将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
);