Folderologia widoków w ASP.NET MVC 5

0

Cześć,
Chciałbym się Was zapytać w jaki sposób mogę pogrupować widoki w ASP MVC 5?
Mogę kontrolery pogrupować dla admina i zwykłe np. Controllers/Admin/HomeController, Controllers/Public/HomeController i to działa ale chciałbym też zrobić tak samo z widokami i móc przy tym korzystać ze skrótów tj. ppm na akcji i go to view/add view.

Macie jakieś pomysły jak to zrobić?

Z góry dziękuję za odpowiedzi,
Pozdrawiam

0

Do tego służą Area, w każdym z nich umieszczasz kontrolery/widoki/viewmodele (oczywiście w odpowiednich podkatalogach) związane z daną sekcją aplikacji.

0

Dziękuję bardzo :)
to takie pytanie już dotyczące obszarów, jeśli mam w Areas foldery Admin i Public to w jaki sposób mogę określić, który z nich będzie ładowany jako pierwszy?

1

Może w routingu?
Strzelam bo się nie znam ale chętnie się dowiem czy trafiłem:)

0
duzy napisał(a):

Dziękuję bardzo :)
to takie pytanie już dotyczące obszarów, jeśli mam w Areas foldery Admin i Public to w jaki sposób mogę określić, który z nich będzie ładowany jako pierwszy?\

A co to w ogóle znaczy "ładowany jako pierwszy"?

0

Ładowany jako pierwszy - miałem na myśli stronę startową bądź też moduł, który się włączy/załaduje po wejściu na np. http://localhost/Example.WebIU/ czyli żebym nie musiał pisać w pasku adresuhttp://localhost/Example.WebIU/Public/News/Index

0

No to musisz default route w routingu skonfigurować.

0

No właśnie w tym problem bo w RouteConfig mam takie coś:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { area = "Public", controller = "News", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "Example.WebUI.Areas.Public.Controllers" }
            );
        }

Przy debugu jest wywoływany dobry kontroler ale już widok jest zły zwracany, chyba, że usunę widok z "głównego" projektu i zostaną tylko te w Areas to wtedy mam taki błąd:
The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/News/Index.aspx ~/Views/News/Index.ascx ~/Views/Shared/Index.aspx ~/Views/Shared/Index.ascx ~/Views/News/Index.cshtml ~/Views/News/Index.vbhtml ~/Views/Shared/Index.cshtml ~/Views/Shared/Index.vbhtml

Więc złe miejsce jest przeszukiwane.

Utworzyłem silnik widoku:

public class CustomLocationViewEngine : RazorViewEngine
    {
        public CustomLocationViewEngine()
        {
            AreaViewLocationFormats = new string[]
            {
                "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/Public/Views/{1}/{0}.cshtml"
            };
        }
    }

oraz zmieniłem global.asax
protected void Application_Start()

        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new CustomLocationViewEngine());
        }

Teraz błąd wygląda tak:
The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/News/Index.cshtml ~/Views/News/Index.vbhtml ~/Views/Shared/Index.cshtml ~/Views/Shared/Index.vbhtml

Edit://
Problem rozwiązany. Usunąłem te silniki widoków i RegisterRoutes wygląda tak:


public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { area = "Public", controller = "News", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "Example.WebIU.Areas.Public.Controllers" } 
            );
        }

Natomiast PublicAreaRegistration tak:

public class PublicAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "Public";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "Public_default",
                "{controller}/{action}/{id}",
                new { controller = "News", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1