2017-09-22 6 views
1

J'ai mis en place la route suivante dans mon projet MVC:MVC Routing Lancer 404

  routes.MapRoute(
       "Product", 
       "product-{pathname}-{productId}", 
       new { controller = "Product", action = "ProductPage" }); 

Cela fonctionne bien pour urls comme product-test-title-1234 mais si le bit pathname de l'URL contient product-, 404 est jeté - Est il y a un moyen de permettre une URL comme product-test-product-title-1234?

Bizarrement, si je mets le deuxième produit juste avant l'identification du produit (par exemple product-test-title-product-12345), les travaux de la route et la page est affichée, nulle part ailleurs et il jette un 404

Mise à jour

Je pense que le problème peut résider dans le fait que 2 parties de l'URL correspondent à l'itinéraire. Ma question est donc de savoir comment vous assurez que l'itinéraire indique que le premier produit doit être au début de l'URL (et compte produit dans le cadre du chemin d'accès).

Après d'autres essais, j'ai trouvé qu'au lieu d'aller au contrôleur de produit, cette URL va à mon itinéraire catchall: {*pathname} - ne sais pas pourquoi cela se produit

+0

Pourquoi un '-' (trait d'union)? - au lieu de 'product/{pathname}/{productId}' pour générer '../ product/test/product-title-1234' –

+0

@StephenMuecke malheureusement c'est le chemin du site actuel et nous devons garder le même de sorte que nous n'avons pas besoin d'implémenter 301 permanents pour toutes les anciennes urls (sinon quand le nouveau site remplacera l'ancien nous serons punis sur le référencement). Aussi, c'est ce que le département marketing veut - je serais allé pour la structure habituelle '/' aussi, mais apparemment une structure d'url peu profonde est également préférable pour les classements de référencement – Pete

Répondre

0

est-il un moyen de permettre une url comme produit-test-product-title-1234?

Oui, mais l'URL de l'itinéraire que vous avez défini comprend 3 tirets et l'URL que vous êtes correspondant contient 4. Vous pouvez correspondre à cette URL en utilisant quelque chose comme:

 routes.MapRoute(
      "Product", 
      "product-{pathname}-product-{productId}", 
      new { controller = "Product", action = "ProductPage" }); 

mais probablement pas ce que Tu recherches. Le problème ici est que lorsque vous utilisez - en tant que délimiteur entre vos espaces réservés d'itinéraire, vous l'espace réservé lui-même ne peut pas contenir - ou la classe Route sera confondue.

Mais le routage est très flexible si vous descendez à un niveau inférieur et héritez RouteBase, ce qui est probablement plus conforme à ce que vous recherchez. Vous pouvez ensuite placer les URL/logiques personnalisées que vous souhaitez dans l'itinéraire, ce qui vous permet de faire correspondre exactement un ancien schéma d'URL même s'il n'était pas très bien organisé.

Voir: Multiple levels in MVC custom routing

+0

Salut Nightlow, merci pour la réponse, malheureusement cela ne fonctionnerait pas comme il doesn ne résout vraiment rien - le chemin qui a le produit à côté de l'identifiant du produit fonctionne déjà (voir la dernière phrase de la question ci-dessus) et je ne veux pas inclure un second chemin (ie je ne veux pas d'itinéraire comme pathname} -product- {pathname1} - {productId} ') car j'ai besoin de tout le bit du chemin pour obtenir les données de la page d'un système cms sans tête – Pete

+0

Voir le lien que j'ai fourni si vous voulez que le système se rende à un système CMS. Utiliser 'MapRoute' ne fonctionne pas pour tous les scénarios, mais si vous héritez' RouteBase', vous pouvez littéralement programmer vos routes pour qu'elles fonctionnent comme vous le souhaitez. – NightOwl888