2017-09-14 6 views
1

Si j'applique [Route (Name = "WhatEver")] à l'action, que j'utilise comme route de site par défaut, j'obtiens HTTP 404 en accédant à la racine du site.RouteAttribute a rompu mon itinéraire par défaut

Par exemple:

  • Créer un nouveau exemple de projet MVC.
  • Ajouter Attributs de routage:

    // file: App_Start/RouteConfig.cs 
    public class RouteConfig 
    { 
        public static void RegisterRoutes(RouteCollection routes) 
        { 
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
         routes.MapMvcAttributeRoutes(); // Add this line 
         routes.MapRoute(
          name: "Default", 
          url: "{controller}/{action}/{id}", 
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
         ); 
        } 
    } 
    
  • Ajouter Attributs de routage

    [RoutePrefix("Zome")] 
    public class HomeController : Controller 
    { 
        [Route(Name = "Zndex")] 
        public ActionResult Index() 
        { 
         return View(); 
        } 
        ... 
    } 
    

Et maintenant, lorsque vous démarrez votre projet pour debuging, vous aurez erreur HTTP 404. Comment dois-je utiliser le routage d'attribut avec le mappage de route par défaut? Lorsque vous démarrez votre site, un chemin par défaut est défini dans le fichier route.config dans le dossier App_Start.

+0

Quel est l'objectif derrière l'utilisation '[Route (Name = "Zndex")]' 'attribut d'action Index'? '[domain]/Zome' se référera automatiquement à' [domain]/Zome/Index', en utilisant 'RouteAttribute' peut nécessiter' [domain]/Zome/Zndex' pour atteindre l'action 'Index'. –

+0

Je pense que les noms de routes ne sont pas utilisés dans la correspondance de route, donc '[domain]/Zome/Zndex' pointe vers nulle part. J'ai besoin d'un nom pour l'itinéraire sur l'action Index, parce que je veux utiliser Url helper avec des noms de route comme ceci: 'Zndex page' –

Répondre

1

Pour l'acheminement par défaut utilisant le routage d'attribut avec le préfixe d'itinéraire, vous devez définir le modèle d'itinéraire comme une chaîne vide. Vous pouvez également remplacer la racine du site en utilisant ~/ si le contrôleur a déjà un préfixe d'itinéraire. Cela dit, lors de l'utilisation du routage d'attributs sur un contrôleur, il ne correspond plus aux routes conventionnelles. Le contrôleur est soit basé sur des attributs, soit sur des conventions qui ne se mélangent pas.

Référence Attribute Routing in ASP.NET MVC 5

+0

pouvez-vous s'il vous plaît pointer moi vers n'importe quel document qui a réellement dit, que je peux utiliser seulement le routage d'attribut sur mon contrôleur, mais pas les deux. Vous référence lien dit réellement (3 fois) que je peux les utiliser dans le même projet (mais pas sur le même contrôleur?) Thx de toute façon –

+0

@ vasily.sib Il a à voir avec l'ordre de l'enregistrement de la route. Étant donné que les routes d'attribut sont vérifiées avant les routes conventionnelles, dès qu'un contrôleur utilise l'attribut route, il n'atteindra jamais les routes conventionnelles. Même s'il n'y a pas de correspondance avec la route d'attribut. Vous obtiendrez l'erreur 404 non trouvée. – Nkosi

+0

J'ai compris. Ajouter l'attribut '[Route (" ~/", Name =" Zefault ")]' à l'action Index fait l'affaire. Cependant, je peux ** combiner ** "routage d'attribut" et "convention-routage" dans le même contrôleur, ** mais pas ** sur la même action. Dans mon exemple d'application, je peux accéder à l'action '/ Home/About', mais'/Home/Index' renverra 404. Est-ce documenté n'importe où dans les internets? Merci beaucoup à mr. @ Nikosi pour pointer mon sur une solution. –

0

Il ressemble à ceci:

 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

Si vous n'avez plus une action « index » dans votre contrôleur à domicile le site tente en vain de nageoire que la page d'accueil et renverra une 404. Vous pouvez mettre à jour votre itinéraire Fichier .config pour référencer la nouvelle page d'accueil.