Контроллеры и представления в структуре каталогов ASP.NET Core MVC - PullRequest
0 голосов
/ 12 сентября 2018

Я занимаюсь разработкой приложения в ASP.NET Core MVC, и у меня есть несколько вопросов, касающихся структуры контроллеров и представлений. Таким образом, приложение имеет одинаковую структуру для двух типов пользователей, компании и инвестора.

Приложение определяет, какой пользователь вошел в систему, и изменяет ссылки меню на формат Company/[controller]/[action] o Investor/[controller]/[action]

.

Структура каталогов следующая:

Imagen estructura de Directorios

Контроллеры имеют следующую метку маршрутизации, которая хорошо работает:

[Route("/Company/[controller]/[action]")]
public class DashboardController : Controller
{...

У меня проблемы с представлениями, которые имеют одинаковую структуру каталогов, так как он не обнаруживает соответствующее представление. Я должен вставить в каждое действие return View("Views/Company/Dashboard/Dashboard.cshtml") со всеми путями к представлению, и это плохо пахнет для меня. То же самое происходит с представлениями, которые имеют частичное отображение для других представлений в том же подкаталоге.

Пример: Company/Dashboard/Dashboard.cshtml содержит:

<partial name="Users" />

Быть Users.cshtml представлением в том же каталоге, что и Dashboard.cshtml

InvalidOperationException: The partial view 'Users' was not found. The following locations were searched:
/Views/Dashboard/Users.cshtml
/Views/Shared/Users.cshtml
/Pages/Shared/Users.cshtml

Это лучший способ реализовать структуру каталогов для приложений такого типа?

Есть ли способ указать mvc искать представление в том же каталоге? (это должно быть автоматическим, но я полагаю, что остановка работы маршрута или аналогичных действий)

Спасибо.

EDIT: Я только что добавил новый класс, который реализует IViewLocationExpander

   public class ViewLocationExpander : IViewLocationExpander
    {
        public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
        {
            string[] locations = new[] 
            {
                "/Views/Company/{1}/{0}.cshtml",
                "/Views/Investor/{1}/{0}.cshtml",
                "/Views/Shared/{0}.cshtml"
            };

            return locations.Union(viewLocations);
        }

        public void PopulateValues(ViewLocationExpanderContext context)
        {
            context.Values["customviewlocation"] = nameof(ViewLocationExpander); 
        }
    }

И я зарегистрировал его

services.Configure<RazorViewEngineOptions>(options =>
            {
                options.ViewLocationExpanders.Add(new ViewLocationExpander());
            });

Но у меня все еще проблемы. Теперь MVC может получить доступ к представлениям, но я не могу различить представление компании и инвестора. Когда я выбираю меню «Инвестор», приложение загружает представление о компании (первый найденный мной вариант)

Как мне сказать меню, какой контроллер использовать?

                <li><a asp-controller="Dashboard" asp-action="Index">Company Dashboard</a></li>
                <li><a asp-controller="Dashboard" asp-action="Index">Investor Dashboard</a></li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...