MVC 路由新闻页面

MVC Routing News Pages

我已经设法让我的 MVC 项目以 SEO 友好的方式呈现新闻项目列表:

/News/ - to present the list

/News/NewsItem/id/news-item-title - the individual news item

我真正想要的是:

News/id/news-item-title

Whosebug 是如何提出问题的。

但是,我似乎无法理解如何进行路由以区分具有相同控制器动作名称(索引)的两个动作。

如有任何建议,我们将不胜感激。

编辑:

这是我的路线配置:

routes.MapRoute(
    "News",
    "News/NewsItem/{newsId}/{newsTitle}",
    new { controller = "News", action = "NewsItem", newsTitle = UrlParameter.Optional },
    new { newsId = @"\d+" }
);

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

编辑 2:

这是我将所有内容修改为:

路线

routes.MapRoute(
    "News",
    "{controller}/{id}/{newsTitle}",
    new { action = "NewsItem", newsTitle = UrlParameter.Optional }
);

控制器

public class NewsController : Controller
{
     public ActionResult Index()
     {
         var q = _ctx.tblNews.OrderBy(x => x.newsCreateDate)
                  .Where(x => x.WebsiteID == 2).ToList();
         return View(q);
     }

     public ActionResult NewsItem(int newsId, string newsTitle)
     {
          return View();
     }
}

视图 - 索引(部分)

<table>
    @foreach (var x in Model)
    {
        <tr>
            <td>@Html.ActionLink(x.newsTitle, "NewsItem", new { newsId = x.newsID, newsTitle = x.newsTitle.ToSeoUrl() })
            </td>
        </tr>
    }
</table>

Actionlink 产生:News/NewsItem?newsId=3&newsTitle=my-news-item

我要:News/3/my-news-item

您可以这样做的一种方法是在路由配置中引入一个额外的路由

RouteConfig.cs:

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

*请注意此路线中的操作值。您将需要该控制器上的相应操作方法。 此外,由于这条路线更具体,它超越了现有的、更通用的路线

可能更安全的 Alt RouteConfig.cs:

            routes.MapRoute(
            name: "News_seo_friendly",
            url: "News/{id}/{seo}",
            defaults: new { controller = "News", action = "NewsItem", seo = UrlParameter.Optional }
        );

新闻控制器:

    public ActionResult NewsItem(string id)
    {
        return View();
    }

另一种方法是在项目中创建 "News" 自己的区域。如果您的应用程序更大,这让您有机会隔离您的路线,并为您的控制器名称提供灵活性。

反馈后编辑 想要提请注意控制器的 NewsItem() 方法上的参数名称应该与路由设置中声明的名称相匹配。在上面的场景中,url: "{controller}/{id}/{seo}"
应与 NewsItem(string id) 中的参数名称匹配...反之亦然。