Как указать местоположение, в котором будет создано представление Mvc для контроллера Mvc?
-
03-07-2019 - |
Вопрос
Важное обновление
С момента выпуска MVC 2.0 Preview 1 эта функция была реализована как часть самого фреймворка в виде областей.Более подробная информация доступна в блоге Фила Хаака здесь
У меня есть контроллер под названием ListManagerController.Этот контроллер содержит метод ActionResult, называемый Index().Когда я нажимаю правой кнопкой мыши на индекс в Visual Studio и выбираю Добавить представление, новое представление создается в /Views/ListManager/Index.
Однако я хочу, чтобы индексное представление и все последующие представления были созданы в /Views/Управлять/ListManager/.Как бы я этого добился?
Редактировать:Было указано, что этот вопрос является дубликатом опубликованного вопроса здесь.Похоже, мои навыки поиска изначально подвели меня.
Решение
Расположение представлений привязано к используемой вами ViewFactory. AFAIK движки просмотра веб-форм не поддерживают области [Управление в вашем примере].
Spark поддерживает это и очень проста: вы также можете смешивать и сопоставлять веб-формы и режимы просмотра, так что не нужно воссоздавать все ваши взгляды.
ОБНОВЛЕНИЕ . Похоже, у Фила Хаака есть сообщение в блоге о том, как этого добиться. Его код предназначен для RC, но я думаю, что он должен хорошо компилироваться в ASP.NET MVC RTM.
Другие советы
Я знаю, что вы уже приняли ответ, но вот что я придумал, экспериментируя с той же идеей, с помощью пост Фила Хаака .
Для начала вам нужно иметь собственный ViewEngine для поиска папок в папке View. Примерно так: (Вы заметите, что это похоже на код области Фила Хаака)
public class TestViewEngine : WebFormViewEngine
{
public TestViewEngine()
: base()
{
MasterLocationFormats = new[] {
"~/Views/{1}/{0}.master",
"~/Views/Shared/{0}.master"
};
ViewLocationFormats = new[] {
"~/{0}.aspx",
"~/{0}.ascx",
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};
PartialViewLocationFormats = ViewLocationFormats;
}
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
ViewEngineResult rootResult = null;
//if the route data has a root value defined when mapping routes in global.asax
if (controllerContext.RouteData.Values.ContainsKey("root")) {
//then try to find the view in the folder name defined in that route
string rootViewName = FormatViewName(controllerContext, viewName);
rootResult = base.FindView(controllerContext, rootViewName, masterName, useCache);
if (rootResult != null && rootResult.View != null) {
return rootResult;
}
//same if it's a shared view
string sharedRootViewName = FormatSharedViewName(controllerContext, viewName);
rootResult = base.FindView(controllerContext, sharedRootViewName, masterName, useCache);
if (rootResult != null && rootResult.View != null) {
return rootResult;
}
}
//if not let the base handle it
return base.FindView(controllerContext, viewName, masterName, useCache);
}
private static string FormatViewName(ControllerContext controllerContext, string viewName) {
string controllerName = controllerContext.RouteData.GetRequiredString("controller");
string root = controllerContext.RouteData.Values["root"].ToString();
return "Views/" + root + "/" + controllerName + "/" + viewName;
}
private static string FormatSharedViewName(ControllerContext controllerContext, string viewName) {
string root = controllerContext.RouteData.Values["root"].ToString();
return "Views/" + root + "/Shared/" + viewName;
}
}
Затем в вашем Global.asax
замените стандартный ViewEngine на свой собственный в Application_Start
:
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestViewEngine());
Теперь, когда вы определяете маршруты в Global.asax
, вам нужно установить значение root
, указывающее папку для поиска в папках «Просмотр» следующим образом: р>
routes.MapRoute(
"ListManager",
"ListManager/{action}/{id}",
new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
);
Этот вопрос в ЗНАЧИТЕЛЬНОЙ степени повторяет этот вопрос
поэтому я процитирую свой ответ на этот вопрос здесь.
Я придумал другое решение это не требует от меня, чтобы свернуть свой собственный вид на двигатель.
В принципе, я хотел сохранить MVC как "Условный" формат, насколько это возможно, но я все еще хотел организовать все мои представления "Admin" в папке ~/Views /Admin .
Пример:
- ~/Просмотры/Администратор/Пользователь/
- ~/Просмотры/Администратор/Новости/
- ~/Просмотры/Администратор/Блог/
Моим решением было создать новый базовый класс для моих конкретных контроллеров admin и "принудительно" указать путь к представлению для этого контроллера.
У меня есть запись в блоге и пример кода здесь: Организуйте свои представления в ASP.Net MVC