MVC3 Custom view engine - PullRequest
       9

MVC3 Custom view engine

2 голосов
/ 16 ноября 2011

У меня есть пользовательский View Engine, производный от WebFormViewEngine.Здесь много чего происходит, в основном кеширование.Я хочу иметь возможность использовать WebFormViewEngine и RazorViewEngine одновременно, возможно ли это?В идеале я хотел бы сделать;

ViewEngines.Add(new MyViewEngine<WebFormsViewEngine>()); ViewEngines.Add(new MyViewEngine<RazorViewEngine>());

, если существует файл .ascx / .aspx / .master, тогда используйте WebForms, в противном случае используйте Razor.существует.

РЕДАКТИРОВАТЬ: Я должен сформулировать мой вопрос лучше.Так как мой пользовательский механизм просмотра происходит от WebFormViewEngine, он, очевидно, использует WebForms, я не могу наследовать от двух классов.Я могу получить от RazorViewEngine, но тогда я потеряю WebForms.Я могу полностью продублировать свой код, извлечь из RazorViewEngine и отредактировать расширения файлов представлений и т. Д., Но, как я уже сказал, в моем движке просмотра много настраиваемого кода, и я буду дублировать сотни строк.WebFormViewEngine и RazorViewEngine являются производными от BuildManagerViewEngine, который, в свою очередь, реализует IViewEngine.Проблема в том, что я должен реализовать методы CreatePartialView () и CreateView (), но как мне узнать, что вернуть (WebForms / Razor?) С использованием обобщений?

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Это возможно, но не рекомендуется , потому что это вносит некоторую путаницу в ваш проект. Вы можете прочитать хорошую статью об этом: Использование нескольких видов двигателей

1 голос
/ 19 декабря 2011

В итоге я создал абстрактный класс: public abstract class MyViewEngine : BuildManagerViewEngine, IViewEngine { }, а затем реализовал / переопределил методы FindView и FindPartialView (в которых был мой кеширующий код).У меня был абстрактный метод public abstract void SetSearchPaths();, который был вызван в моем ctor.

. Затем я создал другой класс, производный от MyViewEngine специально для веб-форм:

public class MyViewEngineWebForms : MyViewEngine
{
    public override void SetSearchPaths()
    {
        base.MasterLocationFormats = new string[] { "~/Skins/{2}/Views/{1}/{0}.master", "~/Skins/{2}/Views/Shared/{0}.master" };
        base.ViewLocationFormats = new string[] { "~/Skins/{2}/Views/{1}/{0}.aspx", "~/Skins/{2}/Views/Shared/{0}.aspx", "~/Skins/Shared/Views/{0}.aspx" };
        base.PartialViewLocationFormats = new string[] { "~/Skins/{2}/Views/{1}/{0}.ascx", "~/Skins/{2}/Views/Shared/{0}.ascx", "~/Skins/Shared/PartialViews/{0}.ascx" };
        base.FileExtensions = new string[] { "aspx", "ascx", "master" };
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return new WebFormView(controllerContext, partialPath, null, base.ViewPageActivator);
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        return new WebFormView(controllerContext, viewPath, masterPath, base.ViewPageActivator);
    }
}

и сделал точното же самое для Razor, но измените расширения файла на .cshtml / .vbhtml и измените WebFormView на RazorView.Добавьте их в коллекцию ViewEngine:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new SeeTicketsWebFormsViewEngine());
ViewEngines.Engines.Add(new SeeTicketsRazorViewEngine());

, и теперь они снова отлично работают вместе со всей моей собственной логикой кэширования.

1 голос
/ 23 ноября 2011

Это не должно иметь значения.

По умолчанию MVC3 включает в себя WebFormsViewEngine и RazorViewEngine, оба они регистрируются автоматически. Я считаю, что они заказаны как WebFormsViewEngine, а затем RazorViewEngine, что означает, что сначала будет проверен вид веб-форм. Если он находит представление, он будет его использовать. Если это невозможно, он будет использовать следующий механизм просмотра, который является механизмом просмотра Razor.

Вы пытались удалить свой пользовательский механизм просмотра и просто оставить конфигурацию по умолчанию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...