2012-02-23 2 views
2

je tentais de le faire:Redéfinition contenu sans RenderBody utilisateur redirection dans MVC3

<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> 

Mais ce ofc n'est pas autorisé, comme je dois avoir @RenderBody() ou une exception se produit. Le problème est que cette solution aurait été si soignée, je veux encore rendre la partie supérieure de la page, mais je voudrais substituer le contenu sauf si l'utilisateur est connecté.

La seule autre solution que je peux penser de est de faire la vérification dans le contrôleur et retourner une autre vue. Le problème avec cela est que je devrais répéter ce code dans chaque contrôleur qui me rend triste.

Existe-t-il un moyen de remplacer globalement le contenu similaire à ci-dessus, sans rediriger l'utilisateur vers une autre URL? Si oui, pourriez-vous me donner un coup de pouce dans la bonne direction? Je semble être un peu coincé dans mon état d'esprit actuel. Je n'utilise pas les classes de sécurité Microsoft par défaut (FormsAuthentication), je ne suis pas capable de le faire dans ce cas.

Merci.

Répondre

1

Créer une vue AccessDenied dans les vues/dossier partagé qui a le même contenu que votre AccessDeniedPartial. Laissez le RenderBody comme il est:

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

Créer un LogOnAuthorizeAttribute qui va vérifier pour l'authentification, sinon montrer la vue AccessDenied.

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

Si vous voulez que le LogOnAuthorizeAttribute à ajouter à chaque contrôleur, ajouter comme filtre au GlobalFilterCollection dans Global.asax.

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new LogOnAuthorizeAttribute()); 
} 
0

La seule autre solution que je peux penser est de faire la vérification dans le contrôleur et de retourner une autre vue.

oui font que

Le problème avec cela est que je dois répéter ce code dans chaque contrôleur qui me rend triste.

bien non, si vous utilisez le nouveau modèle de programmation orienté aspect de mvc, qui est basé sur les attributs de filtre. Vérifiez le AuthorizeAttribute et le modèle de filtre de asp.net mvc.

[Authorize] 
public ViewResult MyAction(...) 

Vous pouvez personnaliser le comportement de cet attribut Authorize assez facilement.

Aussi, vous pouvez en savoir plus sur la programmation orientée aspect ici: http://en.wikipedia.org/wiki/Aspect-oriented_programming

Questions connexes