ASPNET MVC3:如何将锚转换为Html.ActionLink?

时间:2011-09-18 17:08:17

标签: asp.net-mvc

我有以下href链接:

<a href="@Url.Content("~/News/" +item.id+"/"+item.NewsSeoTitle)">title</a>

我用它来显示SEO友好的网址;我希望使用Html.ActionLink而不是锚标记。 考虑到我在网址上没有动作名称,如何在ActionLink中转换锚点?

2 个答案:

答案 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。