【问题标题】:MVC Routing News PagesMVC 路由新闻页面
【发布时间】:2015-08-26 00:19:03
【问题描述】:

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

/News/ - 展示列表

/News/NewsItem/id/news-item-title - 单个新闻项目

我真正想要的是:

新闻/id/news-item-title

Stackoverflow 是如何提出问题的。

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

任何建议将不胜感激。

编辑:

这是我的路线配置:

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

【问题讨论】:

  • 你能显示你当前的路线配置吗?

标签: asp.net-mvc-4 asp.net-mvc-routing


【解决方案1】:

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

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

您可以这样做的另一种方法是在项目中使“新闻”成为其自己的区域。如果您的应用程序较大,这使您有机会隔离您的路线,并为您的控制器名称提供灵活性。

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

【讨论】:

  • 抱歉,我似乎无法让它正常工作。链接数据转到查询字符串:News/NewsItem?newsId=3&newsTitle=my-news-item
  • 不用担心。你能展示一下你的 html 链接是什么样子的吗?
  • 我找到了它没有显示对 SEO 友好的 URL 的原因。路由中的 {id} 应该被命名为 {newsID}。经验教训 - 一切都必须反映!
  • 嘿,抱歉,迟到了。真高兴你做到了。我应该在我的回复中指出控制器的方法参数名称必须与该值的路由占位符名称匹配(更新它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 2011-12-19
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多