2017-01-26 2 views
0

J'ai cherché et cherché à faire de l'ancienne URL comme nous faisions dans les pages aspx où vous pouviez avoir un alias pointant vers une page comme www.domain.com/my-great -alias pointe vers www.domain.com/alias.aspx. Je veux faire la même chose avec MVC mais je n'arrive pas à comprendre comment cela se produira dans la table de routage. Où www.domain.com/my-great-alias apparaîtrait à l'utilisateur final en tant que tel, mais pointez sur www.domain.com/alias/2C# .NET MVC Route Aliasing

Est-ce que cela a du sens pour quelqu'un d'autre que ce que je cherche? ?

// routeur

routes.MapRouteLowercase(
          "Alias", 
          "{id}", 
          new 
          { 
           controller = "alias", 
           action = "select", 
           id = UrlParameter.Optional 
          } 
         ); 

// contrôleur Alias ​​

public ActionResult Select() 
     { 
      return View("select"); 
     } 
Controller

// Recette

public ActionResult Select() 
    { 
     return View(); 
    } 
+0

MVC est configuré pour la carte URL à * méthodes d'action du contrôleur * pas à d'autres URL. Votre question est un peu floue. Qu'est-ce qui est censé se passer si l'utilisateur navigue vers '/ alias/2'? Devrait-il servir la page? Devrait-il donner un 404 non trouvé ou 301 redirection? Dans le premier cas, vous pouvez mapper deux URL différentes à la même méthode d'action. Si c'est le cas, vous pouvez probablement vous débarrasser de '/ alias/2' parce que cela ne semble pas très utile. – NightOwl888

+0

Si vous regardez cette URL http://www.motherearthnews.com/organic-gardening/vegetables/late-season-salad-crops-zb0z1701zsgre ce site est construit en utilisant MVC c'est le comportement que je veux. L'alias provient d'un CMS mais je n'arrive pas à comprendre comment le faire en utilisant simplement MVC. L'alias n'est pas un code fixe dans la source pour l'une de ses URL. – Cpurepair785

Répondre

1

Vous devriez être en mesure de le faire config d'itinéraire en utilisant et les paramètres (comme tant que c'est dans le même domaine):

Routing

 routes.MapRoute(
      name: "AliasRoute", 
      url: "{id}", 
      defaults: new { controller = "Alias" } 
     ); 

Contrôleur

public class AliasController : Controller 
{ 
    public ActionResult Index(string id) 
    { 
     //DO SOME DATABASE STUFF HERE TO LOOKUP THE CORRESPONDIND CONTROLLER AND ACTION 
     var controllerAction = lookupControllerActionInDatabase(id); 
     return View(controllerAction.ViewName); 

     //OR 

     //DO CONDITIONAL CHECKS HERE AND RETURN THE APPROPRIATE VIEW 
     if (id == "my-great-alias") { 
      return View("Alias"); 
     } else if (id == condition1) { 
      return View("viewForCondition1"); 
     } else if (id == condition2) { 
      return View("viewForCondition2"); 
     } 
     //AND SO ON... 
    } 
} 
+0

Ce serait une bonne solution, mais je suis plus à la recherche d'une façon dynamique de le faire. Telles que la recherche de l'URL dans une base de données, puis le retour du contrôle et le nom de l'action, mais en laissant l'URL comme pour l'utilisateur final, ils ne voient que http://www.domain.com/my-great-alias. – Cpurepair785

+0

Quelque chose comme le code ci-dessus permettrait toujours à l'utilisateur final de ne voir que domain.com/my-great-alias, et le code exécuté serait le contrôleur 'Alias'. Cependant, je ne suis pas sûr de la partie "dynamique". Quand vous dites "dynamique" parlez-vous de l'exécution? –

+0

Oui dans winform aspx J'utilise global.cs pour trouver l'alias lorsqu'il est exécuté dans la base de données, puis mis en cache dans une collection. Trouver l'URL obtenir la page afficher le contenu. Dans ce cas, j'ai besoin de la même chose avec la conservation des informations de modèle pour MVC. – Cpurepair785