2
votes

Comment acheminer une URL spécifique dans MVC, sinon renvoyer l'URL demandée

J'ai la route suivante

public class HotelController : Controller
{
    [HttpGet]
    [ActionName("Index")]
    public ActionResult IndexGet(string hotelFolder)
    {
        if(CheckIfFolderExists(hotelFolder))
        {
             return Content("Hotel URL Found");
        }      
        else
        {
            **//Here, I want to return the actual requested URL as it didn't exist in my lookup table
        }
    }
}

Les URL suivantes sont donc acheminées

www.mondomaine.com/en/hotels/my-hotel-name/

www.mondomaine.com/en/hotels/myhotelname/

www.mondomaine.com/en/hotels/my_hotel_name/

Dans mon contrôleur, j'ai une vérification conditionnelle pour voir si l'URL passée existe dans ma table de recherche. Par exemple

    public static void RegisterRoutes(RouteCollection routes)
    {            
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute("Hotel", "en/hotels/{*hotelName}",
            new { controller = "Hotel", action = "index" });
    }

Le routage fonctionne en termes de chemin fr / hotels , si l'URL incorrecte est saisie comme ci-dessous, l'URL réelle est vient de revenir comme d'habitude.

www.mondomaine.com/en/attractions/my-attraction-name/

Fondamentalement, je souhaite créer un dictionnaire d'URL que je souhaite acheminer, et si l'URL demandée n'existe pas dans le dictionnaire, je souhaite renvoyer l'URL demandée, qu'il s'agisse d'un .HTM , Page .HTML ou .ASP.


4 commentaires

Puis-je savoir que vous cherchez toujours la réponse?


Souhaitez-vous rediriger toutes vos URL "attractions" vers une page spécifique? De plus, je ne sais pas comment l'URL "attractions" est liée aux URL et à l'itinéraire de vos "hôtels".


Oui, je cherche toujours une réponse @stom


Si ce code est atteint, l'URL demandée doit être comme / en / hotels / donc je ne comprends pas vers où vous pouvez rediriger, l'URL ne peut jamais être quelque chose comme / en / attractions / à ce stade.


3 Réponses :


1
votes

Je ne comprends pas entièrement votre question, mais si vous souhaitez diffuser des fichiers HTML statiques en dehors des itinéraires que vous avez définis, vous pouvez avoir un dossier public ou statique et autorisez l'accès aux fichiers html.

Vous pouvez le faire en créant un fichier Web.config dans ce dossier et en enregistrant les gestionnaires:

<?xml version="1.0"?>

<configuration>
  <system.webServer>
    <handlers>
      <add name="HtmScriptHandler" path="*.htm" verb="GET"
          preCondition="integratedMode" type="System.Web.StaticFileHandler" />
      <add name="HtmlScriptHandler" path="*.html" verb="GET"
         preCondition="integratedMode" type="System.Web.StaticFileHandler" />
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>
</configuration>

Ensuite, tout fichier .htm ou .html sera servi sur demande.


1 commentaires

J'ai ajouté à ma question pour plus de précisions.



0
votes

Il semble que vous souhaitiez créer une route "fourre-tout" à la fin de la table de routage:

public static void RegisterRoutes(RouteCollection routes)
{            
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute("Hotel", "en/hotels/{hotelName}",
        new { controller = "Hotel", action = "index" });

    // Catch-all Route:
    routes.MapRoute("404-PageNotFound", "{*url}",
        new { controller = "YourController", action = "PageNotFound" } );
}

Consultez cette réponse: https://stackoverflow.com/a/310636/879352

De cette manière, vous pouvez créer le dictionnaire des URL que vous souhaitez à l'itinéraire (au-dessus de l'itinéraire fourre-tout), et tout ce qui n'est pas pris dans le dictionnaire sera dirigé vers la page 404.


1 commentaires

J'ai ajouté à ma question pour plus de précisions.



0
votes

Il semble que le meilleur moyen de gérer ces demandes consiste à ajouter un Middleware vers le pipeline.
Fondamentalement, votre demande passe par plusieurs filtres (comme le middleware de fichiers statiques) jusqu'à ce qu'elle atteigne enfin le middleware de routage.
C'est le seul moyen dont j'ai connaissance pour conserver les informations sur la demande en interne (pas avec les paramètres GET) après son passage dans le middleware de routage.

Exemple :

app.Use(async (context, next) =>
{
     var path = context.Request.Path;
     // Get the name of the hotel
     if(CheckIfFolderExists(path.Substring("/en/hotels/".Length))
     {
          await context.Response.WriteAsync("URL FOUND");
          // or write a file to the response
     }      
     else
     {
          // else let the request through the pipeline
          await next.Invoke();
     }
});


1 commentaires

C'est ASP.NET Core btw.