如何为每个区域使用具有不同视图的全局AccountController?

时间:2012-01-06 23:48:04

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2

我的ASP.NET MVC 3互联网应用程序的默认Controllers文件夹中有一个AccountController。

我如何使用此AccountController作为全局AccountController,但是根据我所在的区域给出不同的布局?

我在名为“SmallSurvey”的区域中的控制器上有[授权]注释。如果客户端没有登录,它会将他重定向到默认的AccountController,它使用标准布局,这不是我想要的。

由于

2 个答案:

答案 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
{
    ...
}