Comment spécifier un nom de zone dans un lien d'action?

156

J'ai une page maître partagée que j'utilise à partir de 2 zones différentes de 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 aucune surcharge pour actionlink qui prend un paramètre de zone, est-il possible de le faire?

Jérémie
la source

Réponses:

245

Deviner..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{})
Jérémie
la source
3
@ Pure.Krome - oui. Rien d'intuitif à ce sujet!
Jeremy
3
Assurez-vous qu'il n'y a pas d'espace blanc avant ou après l'areaname. Sinon, il l'ignorera simplement ... et vous fera alors vous demander pendant quatre heures ce qui ne va pas ... tout comme moi.
Piotr Kula
Comment y ajoutez-vous des paramètres?
Yorro
À quoi cela ressemble-t-il traduit en lien? Je veux dire - lorsque le formulaire est rendu et renvoyé au client.
FrenkyB
79

Quelque chose que j'ai rencontré juste après cela, que j'imagine que d'autres pourraient rencontrer: si vous devez créer un lien depuis une zone vers une action qui ne se trouve pas dans une zone, vous devez toujours spécifier la zone comme une chaîne vide.

Par exemple, j'ai déplacé du code MVC dans une zone et j'ai trouvé que je devais mettre à jour les URL dans la page maître qui référençaient d'autres pages sur le site.

Pour spécifier une URL vers quelque chose qui ne se trouve pas dans une zone, utilisez

Html.ActionLink("home", "Index", new { area = "", controller = "Home" })
Frank Schwieterman
la source
4
C'est un très bon conseil! Mais cela ne donne pas des résultats attendus avec MVC 2. Petite correction - Html.ActionLink ("home", "Index", new {area = "", controller = "Home"})
Alexander Beletsky
15

Utilisation:

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

Remarque : le 4ème paramètre est de passer route Values, si vous passez un paramètre vide, il prendra en compte la structure racine et si vous passez la valeur appropriée, il l'utilisera comme zone.

N'oubliez pas non plus d'utiliser nullou new{}comme 5ème paramètre car le fait de passer nullou new {}lors de la création d'un lien d'action ne surchargera pas la méthode pour (text,action,controller,route data)ou (text,action,controller,route data,html attribute)alors utilisez la méthode appropriée

Subhash Rao
la source
11

Dans MVC2, le don a area="root"fonctionné pour moi comme ci-dessous

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{})
Sreejith
la source
6

Une astuce intéressante que vous pouvez faire si vous utilisez beaucoup une zone dans une vue est de la définir comme une variable en haut:

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

@Html.Action("Something", "Somewhere", awesomeArea)
@Html.ActionLink("Stuff", "FooBar", awesomeArea)
dav_i
la source
4

Voici ce que j'ai proposé comme solution pour permettre à un utilisateur de se connecter aux systèmes d'authentification pré-construits.

Chacun de mes domaines a une version du fichier _LoginPartial.cshtml.

Je pourrais probablement faire en sorte que l'application utilise une seule version du fichier, mais j'ai continué à rencontrer des erreurs en essayant d'utiliser une seule connexion partielle.

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

Voici le code qui est utilisé dans chacun d'eux:

@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>
}
Anthony Hart
la source
La définition explicite du htmlAttributes:fonctionnement a très bien fonctionné pour l'utilisation de plusieurs paramètres.
Travis J
2

Si vous ne pouvez pas utiliser le lien d'application Web standard comme À propos, Accueil, Contac, etc. de la zone. Vous changez de ligne

@Html.ActionLink("Ana Sayfa", "Index", "Home", new { area = "" }, new {})

de

Views \ Shared_Layout.cshtml

ErdincDonmez
la source
1

Dans mon application ASP Net Core, j'ajoute simplement la zone aux attributs html comme ceci:

@Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" , id = @Model.ID, name = @Model.name })
Moleius
la source
0

En utilisant

@Html.ActionLink("DisplayText", "ActionName", "ControllerName", new { area = "AreaName"}, null)

Réalisera ce que vous recherchez.

Le DisplayText est ce qui va afficher (le même que <a href="#">DisplayText</a>), le ActionName est la méthode appelée dans le contrôleur et ControllerName est évidemment le contrôleur que vous voulez appeler! Le paramètre suivant est «Valeur de l'itinéraire» où vous ajouteriez votre zone. Si vous êtes actuellement dans une zone et que vous souhaitez revenir à votre racine Home/Indexpar exemple, vous laisseriez la valeur sous forme de chaîne vide, par exemple new { area = ""}. La valeur finale est «Attributs Html» et où vous ajouteriez une classe si vous le souhaitiez et devrait être un nullsi vous n'avez aucun attribut à ajouter. Mais comme le dernier paramètre est vu comme «Attributs Html»; pour que les valeurs d'itinéraire soient reconnues, cela doit êtrenull

Rob P
la source