Как указать место, где будет создан вид Mvc для контроллера Mvc? - PullRequest
0 голосов
/ 02 мая 2009

Важное обновление
С момента выпуска MVC 2.0 Preview 1 эта функция была реализована как часть самой платформы в виде областей. Более подробная информация доступна в блоге Фила Хаака здесь

У меня есть контроллер под названием ListManagerController. Этот контроллер содержит метод ActionResult, который называется Index (). Когда я нажимаю правой кнопкой мыши на Index в Visual Studio и выбираю Add View, новый вид создается в / Views / ListManager / Index.

Однако я хочу, чтобы представление индекса и все последующие представления были созданы в / Views / Управление / ListManager /. Как мне это сделать?

Редактировать : Было отмечено, что этот вопрос является дубликатом вопроса, размещенного здесь . Похоже, мои навыки поиска подвели меня изначально.

Ответы [ 3 ]

3 голосов
/ 02 мая 2009

Расположение представлений привязано к используемой вами ViewFactory. AFAIK движки просмотра веб-форм не поддерживают области [Управление в вашем примере].

Spark поддерживает это и является очень чистым, вы также можете смешивать и сочетать веб-формы и представления с искрой, чтобы вам не пришлось воссоздавать все ваши представления.

ОБНОВЛЕНИЕ: Похоже, у Фила Хаака есть сообщение в блоге о том, как этого добиться. Его код предназначен для RC, но я думаю, что он должен хорошо компилироваться в ASP.NET MVC RTM.

1 голос
/ 02 мая 2009

Я знаю, что вы уже приняли ответ, но вот что я придумал, экспериментируя с той же идеей, с помощью поста Фила Хаака .

Для начала вам нужно иметь собственный 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, указывающее папку для поиска в папках View, например:

routes.MapRoute(
    "ListManager",
    "ListManager/{action}/{id}",
    new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
 );
0 голосов
/ 02 мая 2009

Этот вопрос ОЧЕНЬ повторяет этот вопрос

поэтому я приведу свой ответ на этот вопрос здесь.

Я придумал другое решение это не требовало, чтобы я катал свой собственный Просмотр двигателя.

По сути, я хотел сохранить MVC как «Конвенция» везет как можно, но я все еще хотел организовать все мои "Admin" просмотры в ~ / Views / Admin папка.

Пример:

  • ~ / Views / Администратор / Пользователь /
  • ~ / Views / Администратор / Новости /
  • ~ / Views / Администратор / Блог /

Моим решением было создать новую базу класс для моего конкретного администратора контроллеры и «форсируют» путь к представление для этого контроллера.

У меня есть запись в блоге и пример кода здесь: Организуйте свои взгляды в ASP.Net MVC

...