我的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 }
);