如何获得一个很好的网址,如“http://stackoverflow.com/questions/1074/asp-mvc”

时间:2009-08-04 12:53:26

标签: asp.net-mvc

任何人都可以帮助我吗?我在ASP.NET MVC中做了一些测试。

我想将优秀的URL实现为stackoverflow.com路由系统。

例如: stackoverflow.com/questions/1074/asp-mvc domain.com/id/title

这是我的代码:

    Global.asax

    中的
  1. routes.MapRoute(NULL,                “的帖子/ {}帖子ID / {标题}”,                new {controller =“Posts”,action =“Details”,post =(string)null},                new {PostId = @“\ d +”,Title = @“([A-Za-z0-9 - ] +)”}            );

  2. 视图中的
  3. 使用这些代码,我正在设置网址:http://localhost:53171/posts/Details?PostID=5&Title=Test-title

    一个人可以告诉我吗?

    非常感谢你。

3 个答案:

答案 0 :(得分:3)

不确定所有stackoverflow网址的含义,但是如果你想要一个干净的网址:

https://stackoverflow.com/Questions/132/thetitle

在你的Global.asax中:

    routes.MapRoute("PostController",
       "Questions/{post_id}/{post_title}",
       new { controller = "Post", action = "Index" },
       new { post_id = @"\d+", post_title = @"([A-Za-z0-9-]+)" }
    );

在您的控制器中检索值:

    public ActionResult Index(Int32 post_Id, String post_title)
    {
        return View();
    }

要生成正确的网址,请使用Html.RouteLink:

<%= Html.RouteLink("The Title", "PostController", new { post_id = 132, post_title = "thetitle" })%>

答案 1 :(得分:1)

我认为您需要在帖子标题的路线中添加一些默认值...并确保它们映射。您似乎没有'postId'和'title'的默认值,但是您有一个不存在的'post'路线值。

routes.MapRoute(
    "PostDetails",
    "posts/{postId}/{title}",
    new { controller = "Posts", action = "Details", postId = 0, title = "" },
    new { PostId = @"\d+", Title = @"([A-Za-z0-9-]+)" }
);

帖子控制器

public ActionResult Details(int postId, string title)
{
    //whatever
}

然后在你看来

<%= Html.ActionLink(Model.Title, "Details", new { @postId = Model.PostID, @title = Model.Title }) %>

或者

<%= Html.ActionLink(Model.Title, "Details", "Posts", new { @postId = Model.PostID, @title = Model.Title }, null) %>

我还建议在帖子模型上创建一个TitleSlug属性。

E.g。 (代码取自here

public partial class Post
{
    public string TitleSlug
    {
        get
        {
            string str = Title.ToLower();

            str = Regex.Replace(str, @"[^a-z0-9\s-]", ""); // invalid chars       
            str = Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space
            str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim(); // cut and trim it
            str = Regex.Replace(str, @"\s", "-"); // hyphens

            return str;
        }
    }
}

HTHS
查尔斯

答案 2 :(得分:0)

您位于正确的路径上,但您只需要将Controller ActionMethod参数的名称与Html.ActionLink中的对象路由值相匹配。

public ActionResult Index(int PostId, string Title)
{
    ...
    return View();
}

<%= Html.ActionLink(Model.Title, "Details", 
    new { PostId = Model.PostID, Title = Model.Title}) %>