Переопределение содержимого RenderBody без перенаправления пользователя в MVC3 - PullRequest
2 голосов
/ 23 февраля 2012

Я пытался сделать это:

<body>
    <div id="Page">
        <div id="TopBar">
            <div id="TopBarLogo">
                <img src="@Url.Content("~/Content/images/Weblogo.png")" />
            </div>
            <div>
                @{ Html.RenderAction("MenuPartial", "MenuPartial"); }
            </div>
        </div>
        <div class="Content">
            @if (SessionWrapper.IsAuthenticated)
            {
                @RenderBody()
            }
            else
            {
                Html.RenderPartial("AccessDeniedPartial");
            }
        </div>
    </div>
</body>
</html>

Но ofc это не разрешено, так как мне нужно иметь @RenderBody (), иначе возникает исключение. Проблема в том, что это решение было бы таким аккуратным, что я все еще хочу визуализировать верхнюю часть страницы, но я хотел бы переопределить содержимое, если пользователь не вошел в систему.

Единственное другое решение, которое я могу придумать, - это выполнить проверку в контроллере и вернуть другое представление. Проблема в том, что мне придется повторять этот код на каждом контроллере, что меня огорчает.

Есть ли способ глобально переопределить содержимое, подобное приведенному выше, без перенаправления пользователя на другой URL-адрес? Если есть, не могли бы вы дать мне толчок в правильном направлении. Кажется, я немного застрял в своем нынешнем мышлении.

Я не использую классы безопасности Microsoft по умолчанию (FormsAuthentication), и я не могу в этом случае.

Спасибо.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Создайте представление AccessDenied в папке Views / Shared, содержимое которого совпадает с вашим AccessDeniedPartial. Оставьте RenderBody как есть:

<div class="Content">
    @RenderBody()
</div>

Создайте LogOnAuthorizeAttribute, который будет проверять подлинность, в противном случае отобразится представление AccessDenied.

public class LogOnAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!SessionWrapper.IsAuthenticated)
        {
            filterContext.Result = new ViewResult {ViewName = "AccessDenied"};
        }
        else
        {
            base.OnAuthorization(filterContext);
        }
    }
}

Если вы хотите, чтобы LogOnAuthorizeAttribute был добавлен к каждому контроллеру, добавьте его в качестве фильтра к GlobalFilterCollection в Global.asax.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new LogOnAuthorizeAttribute());
}
0 голосов
/ 23 февраля 2012

Единственное другое решение, которое я могу придумать, - это выполнить проверку в контроллере и вернуть другое представление.

да, сделай это

Проблема в том, что мне придется повторять этот код на каждом контроллере, что меня огорчает.

ну нет, если вы используете новую модель аспектно-ориентированного программирования mvc, которая основана на атрибутах фильтра. Проверьте AuthorizeAttribute и модель фильтра asp.net mvc.

[Authorize]
public ViewResult MyAction(...)

Вы можете легко настроить поведение этого атрибута Authorize.

Также вы можете прочитать больше о аспектно-ориентированном программировании здесь: http://en.wikipedia.org/wiki/Aspect-oriented_programming

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