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) 中的参数名称匹配...反之亦然。
我已经设法让我的 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) 中的参数名称匹配...反之亦然。