C# 如何实现类似于SO的url重写

C# 如何实现类似于SO的url重写,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,我需要在我的asp.NETMVC站点上实现类似的功能 例如,当用户转到 加载后,主题行与url连接,url如下所示 上面的“/rails-sql-search-through-has-one-relationship”部分被添加到url中 在webforms中很简单,我可以使用url重写。但不确定如何在MVC中实现这一点 以下行来自Global.asax文件 routes.MapRoute( "Default", // Route name

我需要在我的asp.NETMVC站点上实现类似的功能

例如,当用户转到

加载后,主题行与url连接,url如下所示

上面的“/rails-sql-search-through-has-one-relationship”部分被添加到url中

在webforms中很简单,我可以使用url重写。但不确定如何在MVC中实现这一点

以下行来自Global.asax文件

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Account", action = "LogOn", id = UrlParameter.Optional } // Parameter defaults
        );

我需要连接的字符串在我的数据库中,因此它从那里获取。如何完成此操作?

您正在寻找自定义路线。如果你仔细看,所以不关心URL的文本部分。因此:

 http://stackoverflow.com/questions/xxxxxxxx/rails-sql-search-through-has-one-relationship
 AND
 http://stackoverflow.com/questions/xxxxxxxx/
两者都会起作用。您可以通过以下方式轻松做到这一点:

routes.MapRoute(
    "Question",
    "questions/{id}/{title}",
    new { controller = "Question", action = "Details" });
诀窍是在创建链接时在末尾添加“slug”:

@Html.RouteLink(
    "Read more.",
    "Question",
    new { id = question.Id, title = Slugger.ToUrl(question.Title) })

这被称为缓动路线。实现这一点的一种方法是使用可选的
slug
参数定义路线,并在控制器方法中检查是否提供了该参数

routes.MapRoute(
    name: "Question",
    url: "Question/{id}/{slug}",
    defaults: new { controller = "Question", action = "Details", slug = UrlParameter.Optional }
);
然后在
QuestionController
(假设始终提供id)


这叫做鼻涕虫。有关使用操作创建一个的示例,请参见filter@StephenMuecke谢谢你能回答吗?太晚了-要等到明天:)好的,没问题,直到那时我试着弄清楚。但请不要忘记,如果我的申请有两种类型的页面“问题”和“注册”。如何在我的应用程序中注册两个不同的路由?我不确定是否遵循,只要名称是唯一的,您可以注册多个路由。我正在传递此url:并且它给我资源未找到页面。你知道为什么吗?当我通过设置断点初始化请求时,以及当我转到时,MapRoute函数都没有被击中。它说“没有找到视图‘fawad’或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下位置:“听起来像是路线顺序有问题。”。我显示的路线应该是第一条(在默认路线之前),现在可以开始工作了。但是我返回的是view(),而不是view(model)。如果我使用视图(模型),它会抛出“未找到视图‘fawad’或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下位置:”
public ActionResult Details (int id, string slug)
{
    if (string.IsNullOrEmpty(slug))
    {
        // Look up the slug in the database based on the id, but for testing
        slug = "this-is-a-slug";
        return RedirectToAction("Details", new { id = id, slug = slug });
    }
    var model = db.Questions.Find(id);
    return View(model);
}