Как направить определенный URL в MVC, в противном случае вернуть запрошенный URL - PullRequest
2 голосов
/ 11 мая 2019

У меня есть следующий маршрут

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

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

Таким образом, следующие URL-адреса маршрутизируются

www.mydomain.com / ru / hotels / my-hotel-name /

www.mydomain.com / ru / hotels / myhotelname /

www.mydomain.com / ru / hotels / my_hotel_name /

В контроллере у меня естьусловная проверка, чтобы увидеть, существует ли переданный URL в моей поисковой таблице.Например,

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
        }
    }
}

Маршрутизация работает в соответствии с путем en / hotels , если введен неправильный URL-адрес, как показано ниже, фактический URL-адрес будет возвращен как обычно.

www.mydomain.com / ru / Attractions / my-Attraction-name /

По сути, я хочу создать словарь URL-адресов, которые я хочу направить,и если запрошенный URL отсутствует в словаре, я хочу вернуть запрошенный URL, будь то страница .HTM, .HTML или .ASP.

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Я не совсем понимаю ваш вопрос, но если вы хотите обслуживать статические html-файлы отдельно от определенных вами маршрутов, вы можете иметь папку public или static и разрешитьдоступ к html-файлам.

Вы можете сделать это, создав файл Web.config внутри этой папки и зарегистрировав обработчики:

<?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>

Затем любой файл *Файл 1012 * .htm или .html будет предоставлен по запросу.

0 голосов
/ 17 мая 2019

Похоже, лучший способ обработать эти запросы - добавить пользовательское связующее ПО в конвейер.
По сути, ваш запрос проходит через несколько фильтров (например, промежуточное ПО статических файлов), пока, наконец, не достигнетпромежуточное программное обеспечение маршрутизации.
Это единственный способ, которым я знаю, чтобы поддерживать информацию о запросе внутренне (не с параметрами GET) после того, как он проходит через промежуточное программное обеспечение маршрутизации.

Пример:

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();
     }
});
0 голосов
/ 15 мая 2019

Похоже, что вы хотите создать универсальный маршрут в конце таблицы маршрутов:

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" } );
}

Проверьте этот ответ: https://stackoverflow.com/a/310636/879352

Таким образом, вы можете создать словарь URL-адресов, которые вы хотите перенаправить (выше универсального маршрута), и все, что не перехватывается в словаре, будет направлено на страницу 404.

...