在ActionLink()或RouteLink()中提供ID?

时间:2011-10-21 16:06:22

标签: asp.net-mvc asp.net-mvc-3

我是MVC的新手,想要添加~/Destinations/35之类的链接,它将引用Destinations控制器的Index视图,35是要显示的目标的ID。

ActionLink()或RouteLink()似乎都不允许我创建这样的链接。

另外,我尝试过这样的事情:

<table>
@foreach (var d in ViewBag.Results)
{
    <tr>
        <td>
            @Html.ActionLink(
                String.Format("<b>{0}</b>", @Html.Encode(d.Title)),
                "Details", "Destinations")
        </td>
    </tr>
}
</table>

但是我在ActionLink系列上遇到以下错误,我不明白。

  

'System.Web.Mvc.HtmlHelper'没有名为'ActionLink'的适用方法,但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。

有人可以帮我创建此链接吗?

1 个答案:

答案 0 :(得分:5)

您的代码的第一个问题是您尝试在链接文本(<b>标记)中使用HTML,这是不可能的,因为在设计中它始终是HTML编码。

因此,假设您不想在链接中使用HTML,则可以执行此操作:

@Html.ActionLink(d.Title, "Details", "Destinations", new { id = "35" }, null)

假设你需要在锚内部使用HTML,你有几种可能性:

  1. 编写一个自定义的ActionLink助手,它不会对文本进行HTML编码(推荐),然后像这样使用:

    @Html.MyBoldedActionLink(d.Title, "Details", "Destinations", new { id = "35" }, null)
    
  2. 有些事情:

    <a href="@Url.Action("Details", "Destinations", new { id = "35" })">
        <b>@d.Title</b>
    </a>
    
  3. 因为我建议第一种方法是自定义助手的示例实现:

    public static class HtmlExtensions
    {
        public static IHtmlString MyBoldedActionLink(
            this HtmlHelper htmlHelper,
            string linkText,
            string actionName,
            string controllerName,
            object routeValues,
            object htmlAttributes
        )
        {
            var anchor = new TagBuilder("a");
            anchor.InnerHtml = string.Format("<b>{0}</b>", htmlHelper.Encode(linkText));
            var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
            anchor.Attributes["href"] = urlHelper.Action(actionName, controllerName, routeValues);
            anchor.MergeAttributes(new RouteValueDictionary(htmlAttributes));
            return new HtmlString(anchor.ToString());
        }
    }