如何在MVC中路由特定的URL,否则返回请求的URL

时间:2019-05-10 21:15:32

标签: c# .net asp.net-mvc routing routes

我有以下路线

    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/zh-CN/hotels/my-hotel-name /

     

www.mydomain.com/zh-CN/hotels/myhotelname /

     

www.mydomain.com/zh-CN/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/en/attractions/my-attraction-name /

基本上,我想构建一个要路由的URL字典,如果字典中不存在所请求的URL,我想返回所请求的URL,无论是.HTM,.HTML还是.ASP页。

3 个答案:

答案 0 :(得分:1)

我不完全理解您的问题,但是如果您要提供除已定义的路由之外的静态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>

然后,将在请求时提供任何文件 .htm .html 文件。

答案 1 :(得分:0)

您似乎想在路由表的末尾创建“全部捕获”路由:

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页。

答案 2 :(得分:0)

似乎最好的处理这些请求的方法是在管道中添加自定义Middleware
基本上,您的请求会经过多个过滤器(例如静态文件中间件),直到最终到达路由中间件。
这是我知道的在通过路由中间件之后在内部维护有关请求的信息(不使用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();
     }
});