我设法让我的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
答案 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 )...反之亦然。