2011-09-13 1 views
0

J'essaie d'adapter la classe AccountController pour qu'elle utilise ma propre base de données principale. Pour ce faire, je dois envoyer une chaîne à _Layout.cshtml à vérifier. Comment est-ce possible?ASP.Net MVC 3 Envoyer une chaîne de la méthode HTTP-POST à ​​_Layout.cshtml

J'ai essayé avec ViewData mais cela nécessite que le contrôleur corresponde à la vue attachée, par ex. AccountController à View/Account/LogOn.cshtml fonctionnera.

Je crois que ViewBag fonctionne de la même manière que j'obtiens une référence NULL lorsque j'essaie d'y accéder dans _Layout.cshtml.

En ce moment, mon code est un peu endommagé en essayant de résoudre le problème mais voici ce que j'ai. Espérons que cela aidera à mieux expliquer.

AccountController/[HTTP-POST] LogOn

... 
if (user.GetRole(model.UserName).Equals("Admin")) 
{ 
    ViewBag.Role = "Admin"; 
} 
... 

_Layout.cshtml

@if (Request.IsAuthenticated && ViewBag.Role.Equals("Admin")) 
{ 
    ... 
} 

Je ne pense plus cela peut se faire avec ou ViewBag ViewData (En raison de commentaires). Toute solution serait la bienvenue.

Nous vous remercions à l'avance - Ankou

+1

Quelle est votre question? –

+0

Le code ci-dessus ne fonctionne pas, il émet une exception disant essentiellement que le ViewBag.Role ne peut pas être référencé. Je veux savoir comment envoyer une chaîne d'un contrôleur à une vue qui n'est pas directement liée. – Ankou

+0

Ne peut pas être référencé ou ne peut pas effectuer de liaison d'exécution sur une référence null? Si vous ne définissez pas 'ViewBag.Role' si l'utilisateur n'est pas un administrateur, alors il n'existe pas –

Répondre

1

Changer votre code pour

if (user.GetRole(model.UserName).Equals("Admin")) 
{ 
    ViewBag.Role = "Admin"; 
} 
else{ 
    ViewBag.Role = ""; 
} 

Vous obtiendrez une erreur de ViewBag.Role n'existe pas. Donc, il doit toujours être défini.

Edits

De vos commentaires, je pense que vous pourriez être mieux créer une action de l'enfant qui a son propre contrôleur et fait le travail pour vous.

@Html.RenderAction("LogonDisplay"); 

Ceci vérifiera les rôles, définira les valeurs ViewBag et s'affichera si nécessaire.

+0

Je souhaite vraiment que la réponse ait été aussi simple mais elle me donne toujours l'erreur. Je crois que c'est dû aux contrôleurs ayant leur propre ViewBag et parce que AccountController n'est pas connecté à _Layout view. – Ankou

+0

Ah donc ce que vous dites est que dans le code où la vue est retournée, 'ViewBag.Role' n'est pas défini? –

+0

Ouais comment j'ai besoin de AccountController.ViewBag.Role au lieu de HomeController.ViewBag.Role Je pense qu'il faut accéder ou une autre façon de voir ce serait comment je l'envoie au HomeController.ViewBag – Ankou

0

Vous pouvez utiliser l'option _Layout avant d'appeler une action de connexion. Par conséquent, mettez un chèque sur votre _Layout.

@if (Request.IsAuthenticated && ViewBag.Role != null && ViewBag.Role.Equals("Admin")) 
{ 
    ... 
} 
+0

Merci pour votre réponse. Cela permet de se débarrasser de l'erreur générée, mais renforce simplement le fait que la variable dans le ViewBag n'est pas transmise. Je commence à penser que cela n'est peut-être pas possible. Merci – Ankou

+0

Strange, viewbag devrait être là. Avez-vous mis un point d'arrêt dans votre action pour vérifier que ViewBag.Role est en cours de définition? – bencobb

+0

Oui, j'ai terminé et le ViewBag.Role est définitivement défini sur "Admin" – Ankou

Questions connexes