Как использовать глобальный AccountController с различными представлениями для каждой области? - PullRequest
0 голосов
/ 07 января 2012

У меня есть AccountController в папке Controllers по умолчанию моего интернет-приложения ASP.NET MVC 3.

Как я могу использовать этот AccountController в качестве глобального AccountController, но дать ему различные макеты, в зависимости от того, в какой области я нахожусь?

У меня есть аннотация [Authorize] на контроллере в области под названием «SmallSurvey». Если клиент не вошел в систему, он перенаправляет его на AccountController по умолчанию, который использует стандартную компоновку, а это не то, что мне нужно.

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 января 2012

Вы можете создать фильтр действия селектора макетов, который будет использовать параметр 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
{
    ...
}
0 голосов
/ 07 января 2012

Я только что попробовал следующее, и это сработало:

1- Создать область

2- В каталоге области просмотра создайте домашний каталог.

3- В разделеДомашний каталог создает представление с тем же именем, что и представление, которое вы используете в действии вашего контроллера Global Home.

4- Доступ к URL области.

Например, для администратора области используйте URL: / Admin / Home / MyAction

Идет к вашему глобальному домашнему контроллеру, но запускает просмотр в области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...