Как указать местоположение, в котором будет создано представление Mvc для контроллера Mvc?

StackOverflow https://stackoverflow.com/questions/813813

Вопрос

Важное обновление
С момента выпуска 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top