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?

Réponses:


245

Deviner..

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

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" })

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


11

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

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

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)

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

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


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.