Добавление подкаталога в папку "View/Shared" в ASP.Net MVC и вызов представления
В настоящее время я разрабатываю сайт с использованием ASP.Net MVC3 с Razor. Внутри папки "View/Shared" я хочу добавить подпапку под названием "Partials" , где я могу разместить все мои частичные представления (ради организации сайта лучше.
Я могу сделать это без проблем, если я всегда ссылаюсь на папку "Частицы" при вызове представлений (используя Razor):
@Html.Partial("Partials/{ViewName}")
Мой вопрос в том, есть ли способ добавить папку "Partials" в список, который .Net просматривает при поиске вида, таким образом, я могу вызвать свое представление без ссылки на папку "Partials" , например так:
@Html.Partial("{ViewName}")
Спасибо за помощь!
Ответы
Ответ 1
Решил это. Чтобы добавить подкаталог "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} - имя представления.
Затем добавьте этот механизм просмотра в MVC ViewEngines.Engines Collection в методе Application_Start() в вашем global.asax:
ViewEngines.Engines.Add(new RDDBViewEngine());
Ответ 2
Спасибо за ваши ответы. Это организовало мою общую папку, но почему вы создаете новый тип механизма просмотра? Я только что создал новый RazorViewEngine
, установил его PartialViewLocationFormats
и добавил его в список ViewEngines
.
ViewEngines.Engines.Add(new RazorViewEngine
{
PartialViewLocationFormats = new string[]
{
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
}
});
Ответ 3
Приятно настраивать механизм просмотра, но если вы просто хотите, чтобы вложенные папки были частичными, вам это не нужно...
Просто используйте полный путь к частичному представлению, как это сделано для представления макета:
@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")
Надеюсь, что это поможет кому-то...
Ответ 4
Я обновил ламаран отличный ответ, чтобы включить Районы:
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");
}
}
}
Затем не забудьте включить в начало приложения:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
...
ViewEngines.Engines.Add(new RDDBViewEngine());
}
}
Ответ 5
Вы также можете обновить форматы partialview-location зарегистрированного RazorViewEngine.
Поместите нижеприведенный код в Application_Start в Global.asax.
RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault();
if (razorEngine != null)
{
string[] newPartialViewFormats = new[] {
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
};
razorEngine.PartialViewLocationFormats =
razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray();
}
Ответ 6
Вы можете создать свой собственный механизм просмотра, который создается из любого используемого механизма просмотра (Webforms/Razor) и указать любые места, которые вы хотите в конструкторе, или просто добавить их в список уже существующих местоположений:
this.PartialViewLocationFormats = viewLocations;
Затем при запуске приложения вы добавите свой движок просмотра так:
ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());
Ответ 7
Если вы делаете это в 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");
});