如何以与stackoverflow相同的方式路由URL

时间:2012-08-21 08:40:21

标签: c# asp.net-mvc asp.net-mvc-3 url-rewriting asp.net-mvc-routing

这就是我认为这有效的方法

http://stackoverflow.com/questions/12333706/how-to-bla-bla-question

我认为应该有一个控制器动作和链接

@Html.ActionLink("how-to-bla-bla-question", "Questions", "Controller", new{questionId=12333706})
...
public ActionResult Questions(questionId)
{
    ...
}

通常网址应为

http://stackoverflow.com/questions/12333706/

现在这是由javascript处理还是有一些其他方法如何制作带有ID和标题的网址?

1 个答案:

答案 0 :(得分:3)

我完全是这样做的。

Global.asax片段:

routes.MapRoute(
        "GotoPostOrPage",
        "p/{dataItemTypeId}/{dataItemId}/{ignored}", // This allows you to append a random slug if you like
        new { controller = "DataItem", action = "Details", ignored = UrlParameter.Optional }
        );

然后在控制器中出现类似的事情:

public PartialViewResult Details(int dataItemTypeId, int dataItemId)
{
    IDataItemView dataItem = _dataItemService.SelectDataItem(dataItemTypeId, dataItemId);
    DataItemViewModel vm = MappingFunctions.DataItemToViewModel(dataItem);

    return PartialView("_Details", vm);
}

请注意,这允许您附加一个随机的slug,这正是stackoverflow所做的。但是,stackoverflow会将您的slug更正为存储在数据库中的slug。实施这一点非常简单。

另请注意,我已向您展示了我的真实代码;你显然需要稍微调整它(但不是很多)以适应你的场景。重要的是在路由表中附加一个可选的url参数。在我的情况下,我完全忽略它,这实际上也是SO在进行中的过程,因此你可以导航到这个愚蠢的URL并仍然到达:https://stackoverflow.com/questions/12051094/i-like-to-eat-cake