MVC使用带连字符的参数进行高级路由

时间:2015-06-30 10:28:01

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我在MVC 5网站上有一个新闻和一个CARS部分,到目前为止,我为新闻定义了以下路由;

//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文件中的以下代码分割/连接上面的路由参数;

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("$1"));
        var slug = matches.Result("$2");
        return Tuple.Create(id, slug);
    }

我还想为汽车部分使用类似的格式,其中第一个值始终是实体ID:

“/ carsforsale / 15489-ford-fiesta-2009-petrol-manual-black”

我可以通过复制和更新SeperateIDandSlug函数来执行此操作,然后添加构建URL所需的更多参数吗?或者我可以通过使用约束来完成工作吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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+)" });

以上代码为我工作!