【问题标题】:MVC Routing - changing routesMVC 路由 - 更改路由
【发布时间】:2013-09-13 11:15:16
【问题描述】:

使用 MVC4,我有以下路由用于博客文章详细信息操作,它是 SEO 友好的 URL:

public ActionResult Details(int id, string postName)
{
    BlogPost blogPost = _blogService.GetBlogPostById(id);
    string expectedName = blogPost.Title.ToSeoUrl();
    string actualName = (postName ?? "").ToLower();

    if (expectedName != actualName)
        return RedirectToAction("Details", "Blog", new { id = blogPost.BlogPostId, postName = expectedName });

    var vm = BuildBlogPostDetailViewModel(id);
    return View(vm);
}

使用以下辅助方法构建 SEO 路由:

public static class Helper
{
    public static string ToSeoUrl(this string url)
    {
        // ensure the the is url lowercase
        string encodedUrl = (url ?? "").ToLower();

        // replace & with and
        encodedUrl = Regex.Replace(encodedUrl, @"\&+", "and");

        // remove characters
        encodedUrl = encodedUrl.Replace("'", "");

        // remove invalid characters
        encodedUrl = Regex.Replace(encodedUrl, @"[^a-z0-9]", "-");

        // remove duplicates
        encodedUrl = Regex.Replace(encodedUrl, @"-+", "-");

        // trim leading & trailing characters
        encodedUrl = encodedUrl.Trim('-');

        return encodedUrl;
    }
}

这会产生这样的路线:

/Blog/Details/1?postName=user-group-2013

我想要实现的是以下路线:

/Blog/Details/user-group-2013

关于如何实现和优化这一点有什么建议吗?

非常感谢

【问题讨论】:

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


    【解决方案1】:

    试试这个

    return RedirectToAction("Details", "Blog", new { blogPost.BlogPostId,expectedName });
    

    【讨论】:

      【解决方案2】:

      您可以尝试在 RouteConfig 类中更改您的路由。

      您似乎只有默认路线:

      routes.MapRoute(
                      name: "Default",
                      url: "{controller}/{action}/{id}",
                      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                  );
      

      在默认路由之前还有一条路由:

      // This route will return /Blog/Details/1/user-group-2013
      routes.MapRoute(
           name: "MyRoute",
           url: "{controller}/{action}/{id}/{postName}",
           defaults: new { controller = "Blog", action = "Details", id = UrlParameter.Optional, postName = UrlParameter.Optional}
                  );
      
      // Or this route. It should return /Blog/Details/user-group-2013
      routes.MapRoute(
           name: "MyRoute2",
           url: "{controller}/{action}/{postName}",
           defaults: new { controller = "Blog", action = "Details", id = UrlParameter.Optional, postName = UrlParameter.Optional}
                  );
      

      【讨论】:

        猜你喜欢
        • 2013-04-21
        • 2011-02-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 2017-02-03
        • 2015-10-28
        • 2014-02-15
        • 1970-01-01
        相关资源
        最近更新 更多