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