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

9 浏览
0 Comments

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

我有以下路由

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

www.mydomain.com/en/hotels/myhotelname/

www.mydomain.com/en/hotels/my_hotel_name/

在我的控制器中,我有一个条件检查,查看传递的URL是否存在于我的查找表中。例如:

public class HotelController : Controller
{
    [HttpGet]
    [ActionName("Index")]
    public ActionResult IndexGet(string hotelFolder)
    {
        if(CheckIfFolderExists(hotelFolder))
        {
             return Content("找到酒店URL");
        }      
        else
        {
            **//在这里,我想返回实际请求的URL,因为它在我的查找表中不存在
        }
    }
}

在路由方面,en/hotels路径是可用的,如果输入了不正确的URL,如下所示,实际的URL将像往常一样返回。

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

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

0
0 Comments

问题的原因是用户想要在MVC中路由特定的URL,否则返回请求的URL。而解决方法是通过创建一个publicstatic文件夹,并允许访问HTML文件。可以通过在该文件夹中创建一个Web.config文件并注册处理程序来实现。代码如下:



  
    
      
      
      
      
    
  

这样,当请求时,任何.htm.html文件都将被提供。

0
0 Comments

问题的原因是想要在MVC中路由特定的URL,否则返回请求的URL。解决方法是在路由表的末尾创建一个"catch-all"路由。可以通过以下步骤实现:

首先,忽略.axd文件的路由:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

然后,创建特定URL的路由。例如,创建一个名为"Hotel"的路由,将请求映射到"Hotel"控制器的"index"动作:

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

接下来,创建一个"catch-all"路由,将未被上述路由匹配的URL指向"YourController"控制器的"PageNotFound"动作:

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

通过以上步骤,可以建立一个URL字典,将特定的URL路由到相应的控制器和动作。而未在字典中找到的URL将被导向404页面。

以上是根据问题内容整理出的解决方法。详细的问题和解决方法可以参考链接:https://stackoverflow.com/a/310636/879352

0
0 Comments

问题的出现原因:

在MVC中,当请求特定的URL时,需要将其路由到特定的处理方法或控制器。但是,如果没有特定的路由规则,请求的URL应该被返回。因此,需要找到一种方法来区分这两种情况,以便正确地处理请求。

解决方法:

通过向管道中添加自定义Middleware来处理这些请求似乎是一种更好的方法。基本上,请求会经过多个过滤器(如静态文件中间件),直到最终到达路由中间件。这是我知道的唯一一种在请求通过路由中间件后在内部(不使用GET参数)维护有关请求信息的方法。

以下是一个示例:

app.Use(async (context, next) =>

{

var path = context.Request.Path;

// 获取酒店的名称

if (CheckIfFolderExists(path.Substring("/en/hotels/".Length)))

{

await context.Response.WriteAsync("URL FOUND");

// 或者将一个文件写入响应中

}

else

{

// 否则让请求通过管道

await next.Invoke();

}

});

这是ASP.NET Core的示例。通过将此中间件添加到应用程序的管道中,可以在特定URL请求时自定义处理逻辑,并在没有特定URL规则时返回请求的URL。

0