Setting an alternate controller folder location in ASP.NET MVC

后端 未结 4 1439
悲&欢浪女
悲&欢浪女 2020-12-30 07:41

We can an MVC app that uses the default folder conventions for the HTML views, but we\'d like to set up alternate \"Services\" folder with controllers used only for web serv

相关标签:
4条回答
  • 2020-12-30 07:56

    You'll want to create your own controller factory implementing IControllerFactory.

    Check out http://nayyeri.net/custom-controller-factory-in-asp-net-mvc for an example.

    0 讨论(0)
  • 2020-12-30 08:04

    If you see yellow folder names Add folder Name in root

    After, you have to modify routes.MapRoute into "App_Start > RouteConfig"

    Modify Default route

    routes.MapRoute(
              "Default",
              "{controller}/{action}/{id}",
              new { controller = "Home", action = "Index", id =     UrlParameter.Optional },
              new string[] { "mvcPartialView.HomeController" } // Namespace 
          );
    

    and Add this

    routes.MapRoute(
           "ApiControllerOne", // Name of folder
           "ApiControllerOne/{controller}/{action}/{id}",
            new { controller = "ApiFactory", action = "callFactoryOne", id = UrlParameter.Optional },
            new string[] { "mvcPartialView.ApiControllerOne" } // Namespace
        );
    
    0 讨论(0)
  • 2020-12-30 08:05

    You can do this using Routing, and keeping the controllers in separate namespaces. MapRoute lets you specify which namespace corresponds to a route.

    Example

    Given this controllers

    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");
            }
        }
    }
    

    And the following routing

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

    You should expect the following responses

    /Services/Home

    ServiceController

    /Home

    Controllers

    0 讨论(0)
  • 2020-12-30 08:10

    In Asp.Net Core: I used AreaFeature library ServiceCollectionExtensions

    First set your middleware;

        services.AddMvc(options => 
            options.EnableEndpointRouting = false).
            AddFeatureFolders().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Latest);
    

    In the extenssion:

    return AddFeatureFolders(services, new FeatureFolderOptions());
    

    implement as according your requirement:

     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;
            }
    

    In my case i preferred a separated _View folder for views in the features folders like that

    ~/Features/Account/_Views/login.cshtml
    ~/Features/Account/AccountController.cs
    ~/Features/Account/AccountModel.cs
    
    0 讨论(0)
提交回复
热议问题