我有以下href链接:
<a href="@Url.Content("~/News/" +item.id+"/"+item.NewsSeoTitle)">title</a>
我用它来显示SEO友好的网址;我希望使用Html.ActionLink
而不是锚标记。
考虑到我在网址上没有动作名称,如何在ActionLink
中转换锚点?
答案 0 :(得分:3)
即使网址中不存在Html.ActionLink
,您也可以使用action
;你只需要一条合适的路线。路由用于入站URL匹配和出站URL生成。
首先,您需要将Routes集合中的路由用作要生成的URL的模板
routes.MapRoute(
null, // name
"News/{id}/{title}", // URL pattern
new { controller = "News", action = "Index" }, // defaults
new { id = "\d+", title = @"[\w\-]*" }); // constraints
此路线仅在id
为数字且title
仅包含单词字符和/或连字符时才匹配。由于路线的顺序很重要,因此需要在任何更“一般”的路线之前登记该路线;框架在第一条匹配路线上停止,它不会尝试找到“最佳”匹配。
现在您可以使用Html.ActionLink
生成路线。
@Html.ActionLink("title", "Index", "News", new { id = item.id, title = item.NewsSeoTitle })
您可能还想查看 T4MVC (available as a NuGet package),因为它会添加一些重载,从而无需在整个地方消除魔术字符串
假设您的控制器操作符合
public class NewsController
{
public ActionResult Index(int id, string title)
{
return View();
}
}
T4MVC添加了一个允许您使用Html.ActionLink
的重载
@Html.ActionLink("title", MVC.News.Index(item.id, item.NewsSeoTitle))
更整洁:)
答案 1 :(得分:0)
如果您使用的是与控制器/操作结构不对应的自定义链接,可能最好使用您自己的html扩展名
public static string SeoLink(this HtmlHelper helper, string itemId, string title, string seoTitle)
{
return String.Format("<a href=\"{0}\">{1}</a>",
VirtualPathUtility.ToAbsolute(String.Format("~/News/{0}/{1}", itemId, seoTitle)),
title);
}
至于Html.ActionLink
:从扩展名中你可以发现它适用于动作。当然,您可以提供这样的操作和控制器名称以满足您的要求,但这不是一个好主意,特别是如果您的代码将得到任何其他开发人员的支持 - 他永远不会在{{1}中指定的控制器中找到此类操作} ActionLink
param。