1

我有 2 个母版页。一个旨在显示在正常的独立网站中。另一种是在外部站点中用作 iframe。

我希望能够在 http://example.com/home/index 显示普通页面,在http://example.com/framed/home/index显示iframed 版本

我希望拥有可以回发到一个控制器的控件,这样我就不必复制逻辑,因此它们必须在普通版本和 iframed 版本中都可用。

我的问题是,当我尝试使用区域时,我无法让它们与默认 URL 一起正常工作。此外,我还增加了结构图的复杂性。当我尝试点击 /area/controller/action 时,我得到

IControllerFactory 'MySite.Web.Code.IoC.StructureMapControllerFactory' 没有返回名称为 'MyArea' 的控制器。

有谁知道如何使这种设置工作?实际上,我所做的只是尝试显示一组视图(如果它有 /Framed/controller/action),如果它没有 /framed 则显示另一组视图。我认为区域是要走的路,但也许不是。

4

1 回答 1

1

我们所有的控制器都实现了相同的基类,我们使用以下覆盖来执行您所描述的操作:

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);
}

我们所有的 AreaRegistration 都使用以下方法来注册他们的区域:

    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 的问题。

于 2010-10-14T19:21:39.167 回答