我的ASP.NET MVC 3互联网应用程序的默认Controllers文件夹中有一个AccountController。
我如何使用此AccountController作为全局AccountController,但是根据我所在的区域给出不同的布局?
我在名为“SmallSurvey”的区域中的控制器上有[授权]注释。如果客户端没有登录,它会将他重定向到默认的AccountController,它使用标准布局,这不是我想要的。
由于
答案 0 :(得分:0)
我刚刚尝试了以下内容并且有效:
1-创建区域
2-在区域的Views目录下,创建一个主目录。
3-在主目录下,创建一个与您在全球主页控制器操作中使用的视图同名的视图。
4-访问区域URL。
例如,对于区域管理员,请使用URL:/ Admin / Home / MyAction
它转到您的全局家庭控制器,但它运行区域中的视图。
答案 1 :(得分:0)
您可以创建一个布局选择器操作过滤器,它将使用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
{
...
}