Как получить хороший URL-адрес типа "http://stackoverflow.com/questions/1074/asp-mvc" - PullRequest
3 голосов
/ 04 августа 2009

Кто-нибудь может мне помочь? Я делаю некоторые тесты в ASP.NET MVC.

Я хочу реализовать красивый URL как систему маршрутизации stackoverflow.com.

Например: stackoverflow.com/questions/1074/asp-mvc domain.com/id/title

Вот мой код:

  1. в Global.asax

    routes.MapRoute (нуль, "Сообщения / {} сообщения даны / {Title}", new {controller = "Posts", action = "Details", post = (string) null}, new {PostId = @ "\ d +", Title = @ "([A-Za-z0-9 -] +)"} )

  2. в виде:

С этими кодами я получаю URL: http://localhost:53171/posts/Details?PostID=5&Title=Test-title

Можно ли мне посоветовать?

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 04 августа 2009

Не уверен, что означает весь URL-адрес stackoverflow, но если вам нужен чистый URL, например:

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();
    }

Для получения правильного URL используйте Html.RouteLink:

<%= Html.RouteLink("The Title", "PostController", new { post_id = 132, post_title = "thetitle" })%>
1 голос
/ 05 августа 2009

Я думаю, вам нужно добавить в маршрут некоторые значения по умолчанию для заголовка записи ... и убедиться, что они отображаются. Похоже, у вас нет значений по умолчанию для '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 для вашей модели сообщений.

например. (код взят из здесь )

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
Charles

0 голосов
/ 05 августа 2009

Вы находитесь на правильном пути, но вам просто нужно сопоставить имя параметров вашего 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}) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...