【问题标题】:Setting up Index as the default route for a controller将 Index 设置为控制器的默认路由
【发布时间】:2011-03-09 22:17:29
【问题描述】:

我有一个网址

我想变成什么

也可以是http://www.roadkillwiki.org/Page/my-url-with-spaces - 参数是一个字符串。我试过的路线设置是:

routes.MapRoute(
    "ControllerDefault",
    "{controller}/{id}",
    new { controller = "Page", action = "Index", id = UrlParameter.Optional }
);

但是,这会干扰 MVC 项目附带的默认“id”路由。有什么方法可以实现吗?

【问题讨论】:

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


【解决方案1】:

您不需要丢失默认路由。避免您的路线相互干扰的关键是对它们进行排序,以便更具体的规则优先于不太具体的规则。例如:

// Your specialized route
routes.MapRoute(
    "Page",
    "Page/{slug}",
    new { controller = "Page", action = "Index" }
);

// Default MVC route (fallback)
routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

那么您的 PageController 将如下所示:

using System.Web.Mvc;

public class PageController : Controller
{
    public string Index(string slug)
    {
        // find page by slug
    }
}

也就是说,我会强烈建议您改为这样做:

// Your specialized route
routes.MapRoute(
    "Page",
    "Page/{id}/{slug}",
    new { controller = "Page", action = "Index", slug = UrlParameter.Optional }
);

// MVC's default route (fallback)
routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

还有你的 PageController:

using System.Web.Mvc;

public class PageController : Controller
{
    public string Index(int id)
    {
        // find page by ID
    }
}

通过在 URL 的开头(如 StackOverflow)或末尾包含页面 ID,您可以忽略 slug,而是按 ID 检索您的页面。如果您的用户更改页面名称,这将为您省去很多麻烦。我经历过这很痛苦;您基本上必须记录您的页面过去使用的所有名称,这样您的访问者/搜索引擎就不会在每次重命名页面时都收到 404。

希望这会有所帮助。

【讨论】:

  • 我的问题是ID是一个guid,不是特别漂亮。所以:http://www.roadkillwiki.org/Page/12312-4133-434a23-4424fd-444/documentation。看来我需要另一列具有不错 ID 的列
  • 有一些方法可以使 GUID 更漂亮/对 SEO 更友好for example this 可以将c9a646d3-9c61-4cb7-bfcd-ee2522c8f633 缩小到00amyWGct0y_ze4lIsj2Mw,但我同意; int 这里可能是最不打扰的方式。
  • 感谢您提供非常有用的信息 + 链接。我想我会坚持使用数字,因为网址更整洁
【解决方案2】:

如果您不需要项目模板附带的默认路由,您可以这样设置:

routes.MapRoute(
    "ControllerDefault",
    "{controller}/{pagename}",
    new { controller = "Page", action = "Index" }
);

比在你的控制器中你会有一个动作:

        public ActionResult Index(string pagename)
        {
            //do something
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多