Добавление подпапки в папку "View/Shared" в ASP.Net MVC и вызов представления
Я разрабатываю сайт на ASP.Net MVC3 с использованием Razor. В папке "View/Shared" я хочу создать подпапку "Partials", где буду размещать все свои частичные представления для лучшей организации сайта.
Я могу сделать это без проблем, если всегда указываю путь к папке "Partials", вызывая представления (с помощью Razor):
@Html.Partial("Partials/{ViewName}")
Мой вопрос: есть ли способ добавить папку "Partials" в список, который .Net использует при поиске представлений? Таким образом, я мог бы вызывать свое представление без необходимости указывать путь к папке "Partials", как это:
@Html.Partial("{ViewName}")
Спасибо за помощь!
5 ответ(ов)
Если вы работаете с ASP.NET Core, просто перейдите в класс Startup
, в метод ConfigureServices
и добавьте следующий код:
services.AddMvc()
.AddRazorOptions(opt => {
opt.ViewLocationFormats.Add("/Views/{1}/Partials/{0}.cshtml");
opt.ViewLocationFormats.Add("/Views/Shared/Partials/{0}.cshtml");
});
Этот код добавляет путь для поиска частичных представлений в ваших проектах, позволяя вам организовать файлы более удобно.
Решил эту задачу. Чтобы добавить подкаталог "Shared/Partials" в список мест, где происходит поиск частичных представлений в Razor с помощью:
@Html.Partial("{NameOfView}")
Сначала создайте новый класс представления, основанный на RazorViewEngine
, и добавьте свои пути для представлений следующим образом. Я хотел хранить все свои частичные представления в подкаталоге "Partials", который я создал в стандартном каталоге "Views/Shared", созданном MVC.
public class RDDBViewEngine : RazorViewEngine
{
private static readonly string[] NewPartialViewFormats =
{
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
};
public RDDBViewEngine()
{
base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
}
}
Обратите внимание, что {1} в формате пути обозначает имя контроллера, а {0} – имя представления.
Затем добавьте этот класс представления в коллекцию ViewEngines.Engines
в методе Application_Start()
вашего global.asax
:
ViewEngines.Engines.Add(new RDDBViewEngine());
Это позволит вашей MVC-программе находить частичные представления в указанной директории.
Спасибо за ваши ответы! Это помогло организовать мою общую папку, но почему вы создаете новый тип движка представлений? Я просто создал новый RazorViewEngine
, установил его PartialViewLocationFormats
и добавил его в список ViewEngines
.
ViewEngines.Engines.Add(new RazorViewEngine
{
PartialViewLocationFormats = new string[]
{
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
}
});
На самом деле, ваш подход вполне разумен и может работать без создания нового типа движка представлений. Однако создание нового класса может быть полезным в следующих ситуациях:
Расширяемость: Если вам в будущем потребуется добавить дополнительные настройки или изменить поведение вашего движка, то создание наследника даст вам гибкость не изменять существующий код.
Четкость кода: Определение нового класса для специфичных настроек может сделать код более понятным и структурированным, особенно если проект становится большим.
Избежание конфликтов: Когда вы настраиваете стандартные движки, всегда есть риск конфликта с тем, как они уже заведомо настроены. Создание своего собственноручного движка позволяет избежать неожиданных проблем.
В общем, в зависимости от ваших нужд, использование нового класса может быть более предпочтительным, но если текущий подход работает для вас, можете его вполне использовать!
Хорошо, что можно настроить движок представлений, но если вам просто нужно разместить частичные представления в подпапке, то не обязательно делать это так сложно...
Просто укажите полный путь к частичному представлению, как это делается для представления макета:
@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")
Надеюсь, это поможет кому-то...
Вот обновленный ответ на ваш вопрос с учетом поддержки областей в классе RDDBViewEngine
:
public class RDDBViewEngine : RazorViewEngine
{
private static readonly string[] NewPartialViewFormats =
{
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
};
private static List<string> AreaRegistrations;
public RDDBViewEngine()
{
AreaRegistrations = new List<string>();
BuildAreaRegistrations();
base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AreaRegistrations).ToArray();
}
private static void BuildAreaRegistrations()
{
string[] areaNames = RouteTable.Routes.OfType<Route>()
.Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area"))
.Select(r => r.DataTokens["area"].ToString()).ToArray();
foreach (string areaName in areaNames)
{
AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Partials/{0}.cshtml");
AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Partials/{0}.cshtml");
}
}
}
Не забудьте зарегистрировать ваш новый класс RDDBViewEngine
в методе Application_Start
:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
...
ViewEngines.Engines.Add(new RDDBViewEngine());
}
}
Таким образом, вы сможете использовать частичные представления как в основных представлениях, так и в областях вашего приложения.
Экранирование символа @ в Razor View Engine
Обнаружено потенциально опасное значение Request.Form, полученное от клиента
ASP.NET MVC - Установка пользовательского IIdentity или IPrincipal
Компиляция представлений в ASP.NET MVC
ASP MVC: Cookies не сохраняются