如何在MVC中路由特定的URL,否则返回请求的URL。
如何在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页面。
问题的原因是想要在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。
问题的出现原因:
在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。