Как заставить MVC в последний раз искать бритву и виды веб-форм в папке Views / Shared? - PullRequest
1 голос
/ 13 сентября 2011

У меня есть старое приложение ASP.NET MVC, которое использует классические представления веб-форм.В качестве эксперимента мы начали смешивать некоторые виды бритвы.К сожалению, приоритет по умолчанию для того, где найти желаемое представление, не тот, который я хочу.Сначала MVC ищет в вашей папке / Views / ControllerName файлы aspx и ascx.Затем он перемещается в ваши / Views / Shared для файлов aspx и ascx.Затем начинается поиск файлов .cshtml и .vbhtml.Я хочу, чтобы он не заходил в общую папку, пока не исчерпаны все возможности в папке / Views / ControllerName.Как мне это сделать?

--- ОБНОВЛЕНИЕ ---

Вот дополнительная информация, которая может помочь объяснить, что мне нужно.По умолчанию я получаю следующий порядок поиска:

~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml 

То, что я хочу, это:

~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml

Другими словами, он не должен искать Shared, прежде чем он ищет / Views /Папка ControllerName полностью.

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Вы можете настроить приоритет механизмов просмотра в вашем файле global.asax.cs

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new RazorViewEngine());
        ViewEngines.Engines.Add(new WebFormViewEngine());
    }
0 голосов
/ 17 сентября 2011

Немного поиграв с ним, я смог добиться того, чего хотел, с помощью простого Fluent API. Методы расширения удаляют ненужные места поиска в каждом из механизмов просмотра. Места поиска хранятся в строковых массивах .ViewLocationFormats и .PartialViewLocationFormats. Итак, вот свободный API, который удаляет ненужные элементы из этих массивов:

public static class BuildManagerViewEngineFluentExtensions {
    public static BuildManagerViewEngine ControllerViews(this BuildManagerViewEngine engine) {
        return FilterViewLocations(engine, x => x.Contains("/Views/Shared/") == false);
    }

    public static BuildManagerViewEngine SharedViews(this BuildManagerViewEngine engine) {
        return FilterViewLocations(engine, x => x.Contains("/Views/Shared/") == true);
    }

    private static BuildManagerViewEngine FilterViewLocations(BuildManagerViewEngine engine, Func<string, bool> whereClause) {
        engine.ViewLocationFormats = engine.ViewLocationFormats.Where(whereClause).ToArray();
        engine.PartialViewLocationFormats = engine.PartialViewLocationFormats.Where(whereClause).ToArray();
        return engine;
    }
}

И затем, в моем global.asax, я добавил следующие строки в protected void Application_Start()

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine().ControllerViews());
ViewEngines.Engines.Add(new WebFormViewEngine().ControllerViews());
ViewEngines.Engines.Add(new RazorViewEngine().SharedViews());
ViewEngines.Engines.Add(new WebFormViewEngine().SharedViews()); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...