使用连字符参数的 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+)" });

以上代码对我有用!