ASP.NET MVC 5 – визуализация представлений из подпапокC#

Место общения программистов C#
Ответить
Anonymous
 ASP.NET MVC 5 – визуализация представлений из подпапок

Сообщение Anonymous »

У нас есть очень простой проект ASP.NET MVC, который включает в себя EmployeeController и StudentController. В папке «Просмотры» имеются соответствующие папки «Сотрудник» и «Студент».
В папке представления «Сотрудники» находятся следующие файлы. :

Код: Выделить всё

~/View/Employee/Index.cshtml
~/View/Employee/PageNotFound.cshtml
~/View/Employee/Test.cshtml
В папке просмотра «Студент» есть следующие файлы:

Код: Выделить всё

~/View/Student/Index.cshtml
~/View/Student/PageNotFound.cshtml
~/View/Student/Test.cshtml
~/View/Student/About/Index.cshtml
Что касается представлений «Студент», контроллер «О программе» отсутствует. Причина этого в том, что существует CMS, которая публикует файлы .cshtml (возможно, в подпапках) как в папках представления Student, так и в папках для сотрудников на веб-сервере.
Поэтому мне нужен способ загрузить любое представление в любую подпапку ~Views/Student в StudentController. Я нашел ряд статей, в которых описывается, как это можно сделать. Я обнаружил, что представлению не нужен конкретный контроллер, когда нашел этот код:

Код: Выделить всё

protected override void HandleUnknownAction(string actionName)
{
try
{
this.View(actionName).ExecuteResult(this.ControllerContext);
}
catch (InvalidOperationException )
{
Response.Redirect("~/Student/PageNotFound");
}
}
Поэтому, хотя в StudentController нет действия Test, я могу визуализировать https://localhost:44367/Student/Test через метод HandleUnknownAction().
Проблемы начинаются при попытке отобразить представления в подпапках, например https://localhost:44367/Student/About/Index.cshtml.
Эта статья здесь Могу ли я указать собственное местоположение для «поиска представлений» в ASP.NET MVC? решает эту ситуацию, поэтому я попробовал:

Код: Выделить всё

System.Web.Mvc.RazorViewEngine rve = (RazorViewEngine)ViewEngines.Engines
.Where(e => e.GetType() == typeof(RazorViewEngine))
.FirstOrDefault();

string[] additionalPartialViewLocations = new[]
{
"~/Views/Student/About/{0}.cshtml"
};

if (rve != null)
{
rve.PartialViewLocationFormats = rve.PartialViewLocationFormats
.Union(additionalPartialViewLocations)
.ToArray();

rve.ViewLocationFormats = rve.ViewLocationFormats
.Union(additionalPartialViewLocations)
.ToArray();
}
Я жестко запрограммировал путь ~/Views/Student/About/{0}.cshtml, надеясь сказать: «Посмотрите в этой папке». По-прежнему получаю ошибку 404 по адресу https://localhost:44367/Student/About/Index.cshtml.
Я отладил HandleUnknownAction() и заметил, что { строковый параметр actionName для этого URL-адреса равен About, думаю, я ожидал, что это будет Index.
Тогда я подумал, что могу изменить маршрутизацию и придумал это в RouteConfig.cs:

Код: Выделить всё

routes.MapRoute(
name: "Student",
url: "Student/{*url}",
defaults: new { controller = "Student", action = "Index" }
);
Любой запрос ниже Student сопоставляется с одним действием Index в StudentController. Это приближает меня к тому, что я ищу, но теперь я отвечаю за поиск физических файлов по URL-адресам, проверку их существования, перенаправление на PageNotFound.cshmtl, если нет, и т. д.
Мне кажется, что это противоречит всей цели ASP.NET MVC.
Значит, это проблема маршрутизации? Нужен ли мне собственный RazorViewEngine? Мы ожидаем, что будет много файлов .cshtml, сгруппированных в подпапки в папках представлений «Студент» и «Сотрудник», мне нужно как-то загрузить эти представления. Небезосновательно ожидать чего-то вроде ~Views/Student/About/Subfolder1/Subfolder2/Applying.cshtml
Будем благодарны за любую помощь!

Подробнее здесь: https://stackoverflow.com/questions/789 ... subfolders
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»