使用连字符参数的 MVC 高级路由
MVC advanced routing using hyphenated parameters
我的 MVC 5 网站中有一个新闻和一个汽车部分,到目前为止我已经为新闻定义了以下路由;
//route to cheat routing engine to generate id-slug
routes.MapRoute("NewsForReal", "news/{idandslug}", new { controller = "News", action = "Show" });
routes.MapRoute("News", "news/{id}-{slug}", new { Controller = "News", action = "Show" });
之所以有效,是因为我的 NewsController.cs
文件中有以下代码,其中 splits/concatenates 上面的路由参数;
public ActionResult Show(string idandslug)
{
var parts = SeperateIDandSlug(idandslug);
if (parts == null)
return HttpNotFound();
var news = Database.Session.Load<News>(parts.Item1);
if (news == null || news.IsDeleted)
return HttpNotFound();
//redirect urls using correct slug if incorrect - SEO broken URLs
if (!news.Slug.Equals(parts.Item2, StringComparison.CurrentCultureIgnoreCase))
return RedirectToRoutePermanent("Post", new { id = parts.Item1, slug = news.Slug });
return View(new NewsShow
{
News = news
});
}
private Tuple<int, string> SeperateIDandSlug(string idandslug)
{
var matches = Regex.Match(idandslug, @"^(\d+)\-(.*)?$");
if (!matches.Success)
return null;
var id = int.Parse(matches.Result(""));
var slug = matches.Result("");
return Tuple.Create(id, slug);
}
我还想对汽车部分使用类似的格式,其中第一个值始终是实体 ID:
"/carsforsale/15489-ford-fiesta-2009-petrol-manual-black"
我可以通过复制和更新我的 SeperateIDandSlug
函数来完成此操作,然后添加构建 URL 所需的更多参数吗?或者我可以仅使用约束来完成工作吗?
在此先感谢您的帮助!
routes.MapRoute("Cars", "cars/{id}-{make}-{model}-{year}-{fueltype}-{transmission}-{colour}", new { controller = "Cars", action = "Detail" }, new { id = @"(\d+)" });
routes.MapRoute("News", "news/{id}-{slug}", new { controller = "News", action = "Show" }, new { id = @"(\d+)" });
以上代码对我有用!
我的 MVC 5 网站中有一个新闻和一个汽车部分,到目前为止我已经为新闻定义了以下路由;
//route to cheat routing engine to generate id-slug
routes.MapRoute("NewsForReal", "news/{idandslug}", new { controller = "News", action = "Show" });
routes.MapRoute("News", "news/{id}-{slug}", new { Controller = "News", action = "Show" });
之所以有效,是因为我的 NewsController.cs
文件中有以下代码,其中 splits/concatenates 上面的路由参数;
public ActionResult Show(string idandslug)
{
var parts = SeperateIDandSlug(idandslug);
if (parts == null)
return HttpNotFound();
var news = Database.Session.Load<News>(parts.Item1);
if (news == null || news.IsDeleted)
return HttpNotFound();
//redirect urls using correct slug if incorrect - SEO broken URLs
if (!news.Slug.Equals(parts.Item2, StringComparison.CurrentCultureIgnoreCase))
return RedirectToRoutePermanent("Post", new { id = parts.Item1, slug = news.Slug });
return View(new NewsShow
{
News = news
});
}
private Tuple<int, string> SeperateIDandSlug(string idandslug)
{
var matches = Regex.Match(idandslug, @"^(\d+)\-(.*)?$");
if (!matches.Success)
return null;
var id = int.Parse(matches.Result(""));
var slug = matches.Result("");
return Tuple.Create(id, slug);
}
我还想对汽车部分使用类似的格式,其中第一个值始终是实体 ID:
"/carsforsale/15489-ford-fiesta-2009-petrol-manual-black"
我可以通过复制和更新我的 SeperateIDandSlug
函数来完成此操作,然后添加构建 URL 所需的更多参数吗?或者我可以仅使用约束来完成工作吗?
在此先感谢您的帮助!
routes.MapRoute("Cars", "cars/{id}-{make}-{model}-{year}-{fueltype}-{transmission}-{colour}", new { controller = "Cars", action = "Detail" }, new { id = @"(\d+)" });
routes.MapRoute("News", "news/{id}-{slug}", new { controller = "News", action = "Show" }, new { id = @"(\d+)" });
以上代码对我有用!