2010-01-10 6 views
149

J'ai une page maître partagée que j'utilise à partir de 2 zones différentes dans mon application mvc 2. La page maître a un lien d'action qui spécifie actuellement le contrôleur et l'action, mais bien sûr, le lien ne fonctionne pas si je suis dans la mauvaise zone. Je ne vois pas de surcharge pour actionlink qui prend un paramètre de zone, est-ce possible?Comment spécifier un nom de zone dans un lien d'action?

Répondre

233

figured it out ..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{}) 
+1

Oui, c'est une bonne approche. – Ravia

+16

AH !!! c'est ce 'new {}' à la fin que je n'oublie pas d'inclure! –

+3

@ Pure.Krome - oui. Rien d'intuitif à ce sujet! – Jeremy

77

Quelque chose que je courais en juste après cela, que j'imagine que d'autres pourraient courir dans: Si vous devez créer un lien à partir d'une zone à une action pas dans une zone, vous encore besoin de spécifier la zone comme chaîne vide. Par exemple, j'ai déplacé du code MVC dans une zone, et j'ai trouvé que j'avais besoin de mettre à jour les URL dans la page maître qui référencent d'autres pages sur le site.

Pour spécifier une URL pour quelque chose de pas dans une zone, utilisez

Html.ActionLink("home", "Index", new { area = "", controller = "Home" }) 
+4

Ceci est un très bon pourboire! Mais il ne donne pas de résultats attendus avec MVC 2 .. Petite correction - Html.ActionLink ("home", "Index", nouveau {area = "", controller = "Home"}) –

9

En MVC2 donnant area="root" a fonctionné pour moi comme ci-dessous

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{}) 
4

Voici ce que je suis venu avec une solution permettre à un utilisateur de se connecter aux systèmes d'authentification prédéfinis.

Chaque zone contient une version du fichier _LoginPartial.cshtml.

Je pourrais probablement obtenir l'application d'utiliser une seule version du fichier, mais j'ai continué à courir dans les erreurs en essayant d'utiliser une seule connexion partielle.

Ce n'est qu'une légère modification du loginpartial généré original, mais il semble bien fonctionner lorsqu'il est utilisé dans des domaines spécifiques.

Voici le code qui est utilisé dans tous:

@if (Request.IsAuthenticated) 
{ 
    <text> 
    Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", new { area = "" }, htmlAttributes: new { @class = "username", title = "Manage" })! 
    @using (Html.BeginForm("LogOff", "Account", new { area = "" }, FormMethod.Post, new { id = "logoutForm" })) 
{ 
     @Html.AntiForgeryToken() 
     <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a> 
} 
    </text> 
} 
else 
{ 
    <ul> 
     <li>@Html.ActionLink("Register", "Register", "Account", new { area = "" }, htmlAttributes: new { id = "registerLink" })</li> 
     <li>@Html.ActionLink("Log in", "Login", "Account", new { area = "" }, htmlAttributes: new { id = "loginLink" })</li> 
    </ul> 
} 
+0

Définir explicitement le 'htmlAttributes:' travaillé très bien pour l'utilisation de plusieurs paramètres. –

12

Utilisation:

Html.ActionLink("Text", "ActionName", "ControllerName", new { Area = "AreaName" }, null) 

Remarque: 4ème paramètre est de passer la route Values, si vous passez un paramètre vide il considérera la structure de racine et si vous passez la valeur appropriée l'emploient comme région.

ne pas oublier également d'utiliser null ou new{} comme le 5ème paramètre, car le passage null ou new {} tout en créant le lien d'action ne sera pas surcharger la méthode pour (text,action,controller,route data) ou son (text,action,controller,route data,html attribute) utiliser de sorte que la bonne méthode

6

Une astuce que vous pouvez faire Si vous utilisez beaucoup une zone dans une vue, définissez-la comme une variable en haut:

@{ var awesomeArea = new { area = "Awesome" }; } 

@Html.Action("Something", "Somewhere", awesomeArea) 
@Html.ActionLink("Stuff", "FooBar", awesomeArea) 
Questions connexes