Предложение маршрутизации URL в asp.net mvc - PullRequest
2 голосов
/ 06 мая 2010

У меня есть ссылка действия на одной из моих страниц просмотра

<%=Html.ActionLink("Details", "Details", new { id = Model.Id })%> и перенаправляет меня на страницу с таким URL-адресом, как этот http://localhost:1985/Materials/Details/2, вместо этого я хотел бы иметь свой URL-адрес в качестве http://localhost:1985/Materials/Details/steel имени материала вместо Id ... Возможно ли это ..... Это мой метод действия контроллера,

    public ActionResult Details(int id)
    {
        var material = consRepository.GetMaterial(id);
        return View("Details", material);
    }

EDIT: Я выполняю итерацию моего объекта json, возвращенного из контроллера jsonresult ....

$.each(data.Results, function() {
            divs += '<a href="/Materials/Details/' + this.Id + '">Details</a>
            &nbsp;<a href="/Materials/Edit/' + this.Id + '">Edit</a></div>';
            });

Мой маршрут выглядит так,

routes.MapRoute(
                "Default",                                           
                "{controller}/{action}/{id}",                         
                new { controller = "Materials", action = "Index", id = "" } 
            );

1 Ответ

2 голосов
/ 06 мая 2010

Я бы порекомендовал, чтобы ваш URL был

http://localhost:1985/Materials/Details/2/Steel

Похоже, что SO также отображает их URL.

Ваши маршруты будут определены как

routes.MapRoute(
  "action with slug", 
  "{controller}/{action}/{id}/{slug}",
  new {controller = "Error", action = "NotFound", id = "", slug = ""}
);

routes.MapRoute(
  "Default",                                           
  "{controller}/{action}/{id}",                         
  new { controller = "Materials", action = "Index", id = "" } 
);

В ответе на второй вопрос в комментариях "Как удалить детали из ссылки?"Если вы хотите удалить имя ACTION, то есть URL-адрес просто http://site/controler/id/slug, добавьте следующий маршрут ПЕРЕД действием с маршрутом slug.

routes.MapRoute(
  "controller with slug", 
  "Materials/{id}/{slug}",
  new {controller = "Materials", action = "Details", id = "", slug = ""}
);

«Плагин», который будет захватывать слово steel, будетдействие будет проигнорировано, потому что вы все равно хотите, чтобы идентификатор получал материал в любом случае.

Создайте ссылку на маршрут вместо ссылки на действие, например:

<%= Html.RouteLink(material.Name,
      "show with slug", 
      new { controller = "Materials", 
            action = "Details", 
            id = material.Id, 
            slug = Server.HtmlDecode(material.Name).Replace(" ","-")
      }) 
%>

Я заменяю пробелы в своем'slug с дефисами, поэтому браузер не заменяет их на% 20.

Ваши данные ActionResult останутся прежними.

...