ASP.NET MVC route map



请帮助我更正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();
    }

我的问题通过更改路线图得到了解决:

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中选择路线图的名称。

我猜您当前的querystring项正在添加到您的操作链接中。为了避免这个问题,请使用这个重载,并尝试显式地将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>

最新更新