MVC 2.0 - другое представление на основе URL с общими элементами управления - PullRequest
1 голос
/ 14 октября 2010

У меня есть 2 мастер-страницы.Один предназначен для показа на обычном автономном веб-сайте.Другой - для использования на внешних сайтах в качестве Iframe.

Я хочу, чтобы обычная страница отображалась на http://example.com/home/index, а версия iframed на http://example.com/framed/home/index

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

Моя проблема в том, что когда я пытаюсь использовать областиЯ просто не могу заставить их работать правильно с URL-адресом по умолчанию.Кроме того, у меня есть дополнительное усложнение структуры карты.Когда я пытаюсь нажать / area / controller / action, я получаю

IControllerFactory 'MySite.Web.Code.IoC.StructureMapControllerFactory' не возвращает контроллер для имени 'MyArea'.

Кто-нибудь знает, как заставить работать такие настройки?На самом деле все, что я делаю, это пытаюсь показать один набор представлений, если он имеет / Framed / controller / action, и другой набор, если у него нет / framed.Я думал, что районы - это путь, но, возможно, нет.

1 Ответ

1 голос
/ 14 октября 2010

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

protected override ViewResult View(string viewName, string masterName, object model)
{
    if (masterName == null)
    {
        var options = PortalRequestManager.CurrentPortalRouteOptions;
        masterName = options.MvcMasterPath;
    }
    return base.View(viewName, masterName, model);
}

Все наши AreaRegistrations используют следующий метод для регистрации своих областей:

    public static void RegisterMvcAreaRoutes(AreaRegistrationContext context, string name, string url,
                                             object defaults)
    {
        context.MapRoute(name + "Portal",
                         "P/Channel/" + url,
                         defaults);
        context.MapRoute(name + "FramePortal",
                         "F/Channel/" + url,
                         defaults);
    }

И затем PortalRequestManager, который вы видели в первом блоке кода, анализирует URL-адрес, чтобы определить, использует ли он "/ P" или "/ F", чтобы определить, какой MvcMasterPath использовать.

Мы используем фабрику контроллеров Ninject, у которой нет проблем с этой настройкой, поэтому я не могу говорить о ваших проблемах с StructureMap.

...