48 votes

ASP.NET MVC, Html.ActionLink " entre "Zones"

J'ai ajouté une nouvelle Zone à ma MVC3 projet et je suis en train de lien à partir de la _Layout page pour la nouvelle Zone. J'ai ajouté une Zone appelée 'Admin' qui possède un contrôleur de 'Rencontre'.

J'ai utilisé le concepteur visual studio pour ajouter la zone de sorte qu'il a la bonne zone d'enregistrement de classe, etc, et le global.asax fichier, c'est d'enregistrer tous les domaines.

Cependant, lorsque j'utilise les 2 liens d'action dans une page à la racine, j'ai rencontré quelques problèmes:

@Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null)
@Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)

Lorsque vous cliquez sur les deux liens, je suis pris à la Rencontre de contrôleur dans la zone d'Admin, lorsque la demande procède ensuite à jeter une erreur disant qu'il ne trouve pas la page d'Index (même si la page d'Index est présent dans le dossier Vues dans le Domaine de la sous-répertoire.

Href pour le 1er lien ressemble à ceci:

http://localhost/BCC/Meets?area=Admin

Et le href du lien 2e ressemble à ceci:

http://localhost/BCC/Meets

Aussi, si j'ai touché le lien que j'attends d'être créé:

http://localhost/BCC/Admin/Meets

Je viens d'obtenir une ressource ne peut pas être trouvé d'erreur. Tous très perplexe! J'espère que quelqu'un peut aider...

73voto

Darin Dimitrov Points 528142

Étrange en effet. Les étapes qui fonctionnait parfaitement bien pour moi:

  1. Créer un nouveau ASP.NET MVC 3 application à l'aide de la valeur par défaut de Visual Studio modèle
  2. Ajouter une zone appelée Admin à l'aide de Visual Studio designer en cliquant droit sur le projet
  3. Ajouter un nouveau Contrôleur en ~/Areas/Admin/Controllers/MeetsController:

    public class MeetsController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
    
  4. Ajouter une vue correspondante ~/Areas/Admin/Views/Meets/Index.cshtml

  5. Dans la mise en page (~/Views/Shared/_Layout.cshtml) ajouter des liens:

    @Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null)
    @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)
    
  6. L'exécution de l'application.

Rendu HTML pour les ancres:

<a href="http://stackoverflow.com/Admin/Meets">Admin</a>
<a href="http://stackoverflow.com/Meets">Admin</a>

Comme prévu, le premier lien fonctionne, alors que le second ne l'est pas.

Alors, quelle est la différence avec votre installation?

30voto

Shaun Wilson Points 2363

Une autre option est d'utiliser RouteLink() au lieu de ActionLink(), qui contourne la zone inscriptions au total:

ActionLink version:

Html.ActionLink("Log Off", "LogOff", "Account", new { area = "" }, null)

RouteLink version:

Html.RouteLink("Log Off", "Default", 
    new { action = "LogOff", controller = "Account" })

Le deuxième paramètre est un "Nom de l'Itinéraire", qui est enregistrée dans le Mondial.asax.cs et divers "AreaRegistration' sous-classes. L'utilisation de 'RouteLink' de lien entre les différents domaines, vous avez seulement besoin de choisir le bon nom de l'itinéraire.

Cet exemple montre comment générer des trois liens vers différents domaines à partir d'un partage partiel, ce qui fonctionne correctement quel que soit le domaine dans lequel je suis "dans" (le cas échéant):

@Html.RouteLink("Blog", "Blog_default", 
    new { action = "Index", controller = "Article" })
<br/>
@Html.RouteLink("Downloads", "Download_default", 
    new { action = "Index", controller = "Download" })
<br/>
@Html.RouteLink("About", "Default", 
    new { action = "Index", controller = "About" })

Amusez-vous bien!

7voto

jcvandan Points 4654

J'ai compris et j'ai créé un nouveau projet de test et fait exactement la même chose que je faisais avant et ça a fonctionné...puis, après une inspection plus approfondie de toutes les choses concernant la route entre les deux projets que j'ai trouvé un écart.

Dans le global.asax fichier dans mon BCC application, il y avait un voyou ligne de code qui avait inexplicablement apparu:

        public static void RegisterRoutes(RouteCollection routes)
        {
            // Problem here
            routes.Clear();

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }

Comme vous pouvez le voir où mon commentaire est, à un moment ou un autre que j'avais mis les routes.Clear() appeler au début de RegisterRoutes, ce qui signifie après que j'avais enregistré les Domaines dans Application_Start, j'ai été immédiatement compensation de ce que j'avais enregistrés.

Merci pour l'aide...il n'a en fin de compte conduire à mon salut!

3voto

Mikael Östberg Points 10487

Vérifiez que votre AdminAreaRegistration classe ressemble à ceci:

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

et que vous avez ceci en Global.asax.cs:

protected void Application_Start()
{
    ... // ViewEngine Registration
    AreaRegistration.RegisterAllAreas();
    ... // Other route registration
}

2voto

Kwex Points 859

J'ai résolu ce problème en procédant comme suit.

Dans mon Global.asax.cs, j'ai

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

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
    }

    protected void Application_Start()
    {
        //Initialise IoC
        IoC.Initialise();

        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

Dans mon PublicAreaRegistration.cs (secteur Public), j'ai

public class PublicAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Public";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute("Root", "", new { controller = "Home", action = "Index" });

        context.MapRoute(
            "Public_default",
            "Public/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            , new[] { "<Project Namespace here>.Areas.Public.Controllers" }
        );
    }
}

Dans mon AuthAreaRegistration.cs (Zone d'accès Restreint), j'ai

public class AuthAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Auth";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Auth_default",
            "Auth/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Et enfin, mes liens dans mon *.cshtml pages serait comme

1) @Html.ActionLink("fermer la session", "Fermeture de session", new{area= "Public", controller="la Maison"})

ou

2) @Html.ActionLink("Admin", "Index", new {area= "Auth", controller="la Maison"})

Espérons que cela sauve quelqu'un à des heures de recherche! BTW, je parle de MVC3 ici.

Kwex.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X