ASP.Net MVC4自定义路由

G_M*_*Man 2 c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我目前正试图弄清楚如何更改我的博客网址规则.

现在URL是/ Blog/Details/1但我读到这是一个更好的SEO练习来制作URL /Blog/Details/Post-Title.我在我的博客数据库中创建了一个额外的字段,标记为FriendlyUrl,当我创建一个博客条目时,我用破折号( - )替换空格,但现在我不知道如何使我的应用程序正常工作.

我被告知要查看我的global.asx.cs,但这就是我的样子.

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器代码的详细信息

public ActionResult Details(int id = 0)
    {
        Blog blog = _db.Blogs.Find(id);
        if (blog == null)
        {
            return HttpNotFound();
        }
        return View(blog);
    }
Run Code Online (Sandbox Code Playgroud)

这是当前用于链接到博客条目的链接.

<a href="@Url.Action("Details", "Blog", new { id=item.Id})">@Html.DisplayFor(modelItem => item.Title)</a>
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

Dav*_*ich 5

将此路由放在app_start routing.cs文件中的第一个:

       routes.MapRoute(
            "Blog",
            "Blog/{id}",
            new { controller = "Details", action = "Blog", id=0 }
        );
Run Code Online (Sandbox Code Playgroud)

只要路由引擎首先找到此路由,任何以Blog /开头的路由都将路由到Contoller Details和Action Blog.


如果您想要一个更具描述性的路线,专注于SEO友好的slug,请使用以下路线:

       routes.MapRoute(
            "Blog",
            "Blog/{postid}/{slug}",
            new { controller = "Details", action = "Blog", id=0, slug="" } 
        );
Run Code Online (Sandbox Code Playgroud)

以Blog/{postid}开头的任何路由都将路由到Contoller Details和Action Blog.当您的操作或操作过滤器看到将slug留空的路径时,请在数据库中查找并将用户重定向到该URL.

因此,例如,如果您获得类似的路线

/Blog/1287
Run Code Online (Sandbox Code Playgroud)

你应该将用户重定向到

/Blog/1287/how-to-fix-your-routing-engine
Run Code Online (Sandbox Code Playgroud)

该架构与SO使用的设计非常相似.观察如果你试图去做会发生什么

/questions/15593545/
Run Code Online (Sandbox Code Playgroud)

你会发现自己在

/questions/15593545/asp-net-mvc4-custom-routing
Run Code Online (Sandbox Code Playgroud)

您的Action方法现在看起来像这样

public ActionResult Blog (int postid, string slug)
{
Run Code Online (Sandbox Code Playgroud)