Я занимаюсь разработкой приложения в 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>