13

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

所以路由“/Services/Tasks/List”会被路由到“/Services/TaskService.cs”,而“/Tasks/List”会被路由到标准的“/Controllers/TaskController.cs”

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

4

4 回答 4

13

您可以使用路由来执行此操作,并将控制器保存在单独的命名空间中。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
        );

您应该期待以下响应

/服务/首页

服务控制器

/家

控制器

于 2010-12-07T02:14:10.427 回答
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
于 2020-04-23T16:34:51.270 回答
0

您需要创建自己的控制器工厂来实现 IControllerFactory。

查看http://nayyeri.net/custom-controller-factory-in-asp-net-mvc以获取示例。

于 2010-12-07T01:22:56.240 回答
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
    );
于 2016-08-02T16:55:59.660 回答