Вы можете создать фильтр действия селектора макетов, который будет использовать параметр ReturnUrl
, чтобы определить, был ли первоначальный запрос для контроллера, расположенного внутри области, или нет, и на основе этой информации выбрать альтернативный макет:
public class LayoutSelectorAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var result = filterContext.Result as ViewResult;
if (result == null)
{
return;
}
var request = filterContext.HttpContext.Request;
var returnUrl = request["returnurl"];
if (string.IsNullOrEmpty(returnUrl))
{
return;
}
var url = new Uri(new Uri(request.Url.GetLeftPart(UriPartial.Authority)), returnUrl);
var fakeRequest = new HttpRequest(null, url.AbsoluteUri, url.Query);
var fakeResponse = new HttpResponse(TextWriter.Null);
var httpContext = new HttpContext(fakeRequest, fakeResponse);
var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
var area = routeData.DataTokens["area"] as string;
if (string.Equals(area, "SmallSurvey", StringComparison.OrdinalIgnoreCase))
{
result.MasterName = "~/Views/Shared/_SmallSurveyLayout.cshtml";
}
}
}
и затем украсьте свой AccountController
этим:
[LayoutSelector]
public class AccountController : Controller
{
...
}