Asp.Net MVC 5 路由未被击中



我的RouteConfig中有这个:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
name: "StoreSearch",
url: "{storeName}",
defaults: new { controller = "Search", action = "Store" }
);

基本上我有第二条路由,所以如果我输入localhost:9000/facebook则没有名为facebook的控制器,因此我的第二台路由器应该facebook作为storeName并点击Search控制器的Store操作。但目前我得到 404。

任何想法如何解决这个问题?

如果您有特定的存储集或验证它们的方法,则可以向路由添加约束。

添加具有匹配谓词的泛型约束

public class ServerRouteConstraint : IRouteConstraint
{
private readonly Func<Uri, bool> _predicate;
public ServerRouteConstraint(Func<Uri, bool> predicate)
{
this._predicate = predicate;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName,
RouteValueDictionary values, RouteDirection routeDirection)
{
return this._predicate(httpContext.Request.Url);
}
}

然后在路由中添加参数

routes.MapRoute(
name: "StoreSearch",
url: "{storeName}",
defaults: new { controller = "Search", action = "Store" }, constraints: 
//this could be new { controller ="pattern" } 
new {
serverRoute = new ServerRouteConstraint(url =>
{
//this will check that the route starts with a specific string in this case Settings
return url.PathAndQuery.StartsWith("/Settings",
StringComparison.InvariantCultureIgnoreCase);
})
});

有关示例,请检查:https://www.c-sharpcorner.com/UploadFile/dacca2/route-constraints-in-mvc/

此外,应从最具体到最一般添加路由。

应将任何自定义路由放置在Default路由上方。

只需交换订单,您就可以开始了

//before default route
routes.MapRoute(
name: "StoreSearch",
url: "{storeName}",
defaults: new { controller = "Search", action = "Store" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);