ASP.NET URL 中没有控制器或操作名称的 MVC 路由
ASP.NET MVC routing without controller or action name in URL
我的 URL 结构就像 http://website.com/city-state/category 例如/miami-fl/restaurants 或 /los-angeles-ca/bars。为了将它发送到正确的控制器,我有一个从 RouteBase 派生的 class,它拆分请求路径并计算出城市、州和类别。这适用于传入的 URLs.
public class LegacyUrlRoute : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData routeData = new RouteData();
routeData.RouteHandler = new MvcRouteHandler();
string url = httpContext.Request.Path.ToLower(); //e.g. url = /los-angeles
string[] path = url.TrimStart('/').Split('/'); //
if (path.Length > 1)
{
string[] locale = path[0].Split('-');
if (locale.Length > 1) //This is a city page, so send it to category controller
{
string stateName = locale[locale.Length - 1];
string cityName = path[0].Replace(stateName, "").TrimEnd('-');
routeData.Values.Add("controller", "Category");
routeData.Values.Add("action", "City");
routeData.Values.Add("categoryname", path[1]);
routeData.Values.Add("city", cityName);
routeData.Values.Add("state", stateName);
}
}
}
}
但是,当我尝试使用 Html.ActionLink 创建一个 link 时,它并没有从这个 class 中提取。
@Html.ActionLink("Restaurants in Miami", "Index", "Category", new {categoryname="Restaurants", state="FL", city="Miami"})
给我 url 的 /category/index?categoryname=restaurants&state=fl&city=miami。
如何为我的 URL 结构生成准确的 links。
如果您希望传出 URL 正常运行,您必须实施 GetVirtualPath
,它将一组路由值转换为 URL。它通常应该是您的 GetRouteData
方法的镜像。
实现它的最简单方法就是制作一个数据结构,将您的路由值映射到 URLs,然后在两种方法中使用它,如 .
我的 URL 结构就像 http://website.com/city-state/category 例如/miami-fl/restaurants 或 /los-angeles-ca/bars。为了将它发送到正确的控制器,我有一个从 RouteBase 派生的 class,它拆分请求路径并计算出城市、州和类别。这适用于传入的 URLs.
public class LegacyUrlRoute : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData routeData = new RouteData();
routeData.RouteHandler = new MvcRouteHandler();
string url = httpContext.Request.Path.ToLower(); //e.g. url = /los-angeles
string[] path = url.TrimStart('/').Split('/'); //
if (path.Length > 1)
{
string[] locale = path[0].Split('-');
if (locale.Length > 1) //This is a city page, so send it to category controller
{
string stateName = locale[locale.Length - 1];
string cityName = path[0].Replace(stateName, "").TrimEnd('-');
routeData.Values.Add("controller", "Category");
routeData.Values.Add("action", "City");
routeData.Values.Add("categoryname", path[1]);
routeData.Values.Add("city", cityName);
routeData.Values.Add("state", stateName);
}
}
}
}
但是,当我尝试使用 Html.ActionLink 创建一个 link 时,它并没有从这个 class 中提取。
@Html.ActionLink("Restaurants in Miami", "Index", "Category", new {categoryname="Restaurants", state="FL", city="Miami"})
给我 url 的 /category/index?categoryname=restaurants&state=fl&city=miami。 如何为我的 URL 结构生成准确的 links。
如果您希望传出 URL 正常运行,您必须实施 GetVirtualPath
,它将一组路由值转换为 URL。它通常应该是您的 GetRouteData
方法的镜像。
实现它的最简单方法就是制作一个数据结构,将您的路由值映射到 URLs,然后在两种方法中使用它,如