Карта маршрутов ASP.NET MVC

Пожалуйста, помогите мне исправить мою карту маршрутов ASP.NET MVC.

У меня есть пункт меню с ActionLink:
<li>@Html.ActionLink("Articles", "List", "Article")</li>

На домашней странице это выглядит так: localhost/Article что в порядке.

Но на конкретной странице статьи с URL localhost/Article/List/11 моя ссылка в меню такая же:localhost/Article/List/11

Но мне нужно localhost/Article

Мой код карты маршрута выглядит следующим образом:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Article",
        url: "Article/{action}/{id}",
        defaults: new { controller = "Article", action = "List", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Вот код контроллера:

public ActionResult List(int? id)
    {
        ArticlesDataManager artMgr = new ArticlesDataManager();
        ArticleViewModel art = new ArticleViewModel();

        art.Articles = artMgr.GetLastArticles();

        art.Article = (id == null) ? artMgr.GetLast() : artMgr.GetArticle((int)id);

        ViewData.Model = art;

        return View();
    }

2 ответа

Решение

Моя проблема была решена путем изменения моей карты маршрутов:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
               name: "ArticleByFirst",
               url: "Article/{action}/",
               defaults: new { controller = "Article", action = "List" }
           );

            routes.MapRoute(
                name: "ArticleById",
                url: "Article/List/{id}",
                defaults: new { controller = "Article", action = "List", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }

И моя ссылка меню выглядит так: <li><a href="@Url.RouteUrl("ArticleByFirst", new { action = "List" })">Articles</a></li>

И моя ссылка на товар: <li><a href="@Url.RouteUrl("ArticleById", new { id = item.Id })">@item.Name</a></li>

Это не хорошо, что я не могу выбрать название карты маршрутов в ActionLink.

Я думаю, что ваши текущие элементы строки запроса добавляются к вашей ссылке действия. Чтобы избежать этой проблемы, используйте эту перегрузку и попробуйте явно передать null как RouteValues ​​и посмотреть, какие изменения это приносит.

public static MvcHtmlString ActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string actionName,
    string controllerName,
    RouteValueDictionary routeValues,
    IDictionary<string, Object> htmlAttributes
)

Таким образом, ваш код может быть переписан как

<li>@Html.ActionLink("Articles", "List", "Article",
                                        new RouteValueDictionary { },null)</li>

Вы также можете попробовать эту версию также

<a href="Url.Action("List", "Articles")">Articles</a>
Другие вопросы по тегам