在ASP.NET MVC中设置备用控制器文件夹位置

时间:2010-12-07 01:15:58

标签: asp.net-mvc asp.net-mvc-routing asp.net-mvc-controller

我们可以使用HTML视图的默认文件夹约定的MVC应用程序,但是我们想要设置备用“服务”文件夹,其中控制器仅用于返回xml或json的Web服务。

因此路由“/ Services / Tasks / List”将路由到“/Services/TaskService.cs”,而“/ Tasks / List”将路由到标准“/Controllers/TaskController.cs"

我们希望将服务控制器与视图控制器分开。我们认为区域或使用其他项目不会起作用。什么是最好的方法来解决这个问题?

4 个答案:

答案 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
    );