MVC路由新闻页面

时间:2015-06-10 16:01:59

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

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

  

/新闻/ - 提供清单

     

/ News / NewsItem / id / news-item-title - 个人新闻

我真正想要的是:

  

新闻/ ID /新闻条目标题

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&amp; newsTitle = my-news-item

我想:新闻/ 3 / my-news-item

1 个答案:

答案 0 :(得分:2)

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

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

NewsController:

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

另一种可以做到这一点的方法是制作&#34;新闻&#34;项目内有自己的区域。如果您的应用程序更大,并且您的控制器名称具有灵活性,这使您有机会隔离您的路线。

反馈后修改 想要引起注意这样一个事实,即控制器的NewsItem()方法上的参数名称应该与路由设置中声明的内容相匹配。在上面的方案中,网址:&#34; {controller} / { id } / {seo}&#34;
应与NewsItem中的参数名称匹配(字符串 id )...反之亦然。