【问题标题】:How to convert anchor tag HTML links to use @Html.ActionLink如何将锚标记 HTML 链接转换为使用 @Html.ActionLink
【发布时间】:2015-08-10 21:04:30
【问题描述】:

我正在处理一个本地化项目,我需要将锚标记转换为使用@Html.ActionLink

我有这个 html 助手:

@helper RenderIcon(bool condition, string @class, string title, string url, bool openInNewWindow = false)
{
    if (condition)
    {
        <a href="@(new MvcHtmlString(url))" @(openInNewWindow ? " target='_blank'" : "")>
            @(this.RenderIconSpan(@class, title))
        </a>
    }
}

我想出了这个:

        @Html.ActionLink(this.RenderIconSpan(@class, title), url, null, openInNewWindow ? new { target="_blank" } : null)

但我收到此错误:

无法解析方法...候选人是...

如果我需要提供更多信息,请发表评论,我会提供。我从未将如此复杂的锚标记转换为ActionLink,而且我不确定三元运算符以及我所做的一切是否正确。

【问题讨论】:

  • MVC 默认方法不允许你这样做。但是已经发布了一个简单的 hack 演示。您也可以通过其他方式实现您的目标。如果这个技巧不起作用,请告诉我。
  • @Url.Action... href="@Url.Action("index", "home")"... 一样有什么问题?
  • @Max Poshusta 是他们使用Html.ActionLink的任何限制吗?
  • 嘿,我现在正在打电话 - 我早早离开了办公室。 Mehmood 我会在早上更深入地阅读答案,但我认为没有任何限制,而且@Alexei Levenkov 我也在玩弄 Url.Action 以及使用它可以解决我的问题的想法。再次,我将在早上深入研究这些内容并发表回复。感谢您的所有意见!
  • 今天早上我和一位同事谈过这件事(他昨天不在办公室)。原来有人已经创建了一种方法来做我需要的事情。我只是在@(new MvcHtmlString(CalledTheMethodHere) 之后调用了该方法。不过,感谢您的回答,我正在经历大量的这些转换,我相信我可以在某个时候利用这些答案!

标签: c# html razor


【解决方案1】:

您不能使用开箱即用的Html.ActionLink 函数来嵌套元素。您将必须创建一个重载,该重载采用 MvcHtmlString 之类的内容并将其插入到锚点中。

public static IHtmlString ActionLink(this HtmlHelper html, IHtmlString innerHtml, string action, string controller, IDictionary<string, object> htmlAttributes)
{
    var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
    var tag = new TagBuilder("a");
    tag.MergeAttributes(htmlAttributes);
    tag.MergeAttribute("href", urlHelper.Action(action, controller));
    return new HtmlString(tag.ToString(TagRenderMode.Normal));
}

(凭记忆,所以我敢肯定你必须解决一些问题)

【讨论】:

    【解决方案2】:

    如果您需要使用 ajax 或手动创建链接时无法使用的某些功能(使用标签),这里是 Hack(低级和肮脏)解决方法:

    <%= Html.ActionLink("LinkTextToken", "ActionName", "ControllerName").ToHtmlString().Replace("LinkTextToken", "Refresh <span class='large sprite refresh'></span>")%>
    

    您可以使用任何文本来代替“LinkTextToken”,它只是被替换,重要的是它不会出现在 actionlink 内的其他任何地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2018-03-30
      • 1970-01-01
      相关资源
      最近更新 更多