В случае, если кто-то пытается сделать что-то подобное, я использовал идею из этого поста: Категории контроллеров в MVC Routing? (Дублирующие имена контроллеров в отдельных пространствах имен) Мне пришлось вообще создавать дамп, используя области, и сам что-то реализовывать.
У меня есть Controllers / HomeController.cs и Controllers / Framed / HomeController.cs
У меня есть класс ControllerBase, от которого наследуются все контроллеры в / Controllers. У меня есть AreaController, который наследует от ControllerBase, от которого расширяются все контроллеры в / Controllers / Framed.
Вот мой класс контроллера области
public class AreaController : ControllerBase
{
private string Area
{
get
{
return this.GetType().Namespace.Replace("MySite.Controllers.", "");
}
}
protected override ViewResult View(string viewName, string masterName, object model)
{
string controller = this.ControllerContext.RequestContext.RouteData.Values["controller"].ToString();
if (String.IsNullOrEmpty(viewName))
viewName = this.ControllerContext.RequestContext.RouteData.Values["action"].ToString();
return base.View(String.Format("~/Views/{0}/{1}/{2}.aspx", Area, controller, viewName), masterName, model);
}
protected override PartialViewResult PartialView(string viewName, object model)
{
string controller = this.ControllerContext.RequestContext.RouteData.Values["controller"].ToString();
if (String.IsNullOrEmpty(viewName))
viewName = this.ControllerContext.RequestContext.RouteData.Values["action"].ToString();
PartialViewResult result = null;
result = base.PartialView(String.Format("~/Views/{0}/{1}/{2}.aspx", Area, controller, viewName), model);
if (result != null)
return result;
result = base.PartialView(String.Format("~/Views/{0}/{1}/{2}.ascx", Area, controller, viewName), model);
if (result != null)
return result;
result = base.PartialView(viewName, model);
return result;
}
}
Мне пришлось переопределить методы представления и частичного просмотра. Таким образом, контроллеры в моей «области» могут использовать методы по умолчанию для представлений и частичных данных и поддерживать добавленные структуры папок.
Что касается просмотров, у меня есть Views / Home / Index.aspx и Views / Framed / Home / Index.aspx. Я использую маршрутизацию, как показано в посте, но вот как моя выглядит для справки:
var testNamespace = new RouteValueDictionary();
testNamespace.Add("namespaces", new HashSet<string>(new string[]
{
"MySite.Controllers.Framed"
}));
//for some reason we need to delare the empty version to support /framed when it does not have a controller or action
routes.Add("FramedEmpty", new Route("Framed", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}),
DataTokens = testNamespace
});
routes.Add("FramedDefault", new Route("Framed/{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new
{
//controller = "Home",
action = "Index",
id = UrlParameter.Optional
}),
DataTokens = testNamespace
});
var defaultNamespace = new RouteValueDictionary();
defaultNamespace.Add("namespaces", new HashSet<string>(new string[]
{
"MySite.Controllers"
}));
routes.Add("Default", new Route("{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}),
DataTokens = defaultNamespace
});
Теперь я могу перейти на / Home / Index или / Framed / Home / Index на одном сайте и получить два разных представления с общим контролем. В идеале мне бы хотелось, чтобы один контроллер возвращал одно из двух представлений, но я понятия не имею, как заставить это работать без двух контроллеров.