如何使用HtmlHelper创建外部超链接?

时间:2012-01-19 20:29:42

标签: c# asp.net-mvc asp.net-mvc-2

就像我可以在ASP.NET MVC中创建一个指向控制器中的动作的ActionLink(例如 - @Html.ActionLink("MyDisplayText", "MyAction", "MyController"))一样,我希望能够创建一个明确的超链接 - 定义,外部网址。

我正在寻找的是像@Html.HyperLink("stackoverflow", "http://www.stackoverflow.com/")这样的代码来生成此HTML:<a href="http://www.stackoverflow.com/">stackoverflow</a>

如果无法做到这一点,我总是可以手工编写HTML。

(这是我的第一个stackoverflow问题。多么令人兴奋。)

6 个答案:

答案 0 :(得分:15)

自定义助手可能如下所示:

namespace System.Web.Mvc {
    public static class HtmlHelperExtensions {
        public static MvcHtmlString Hyperlink(this HtmlHelper helper, string url, string linkText) {
            return MvcHtmlString.Create(String.Format("<a href='{0}'>{1}</a>", url, linkText));
        }
    }
}

这可能是您使用的许多自定义HtmlHelper中的第一个!

答案 1 :(得分:13)

这个问题已有几年历史了,旨在作为ASP.NET MVC v2的答案。现在可能有更好,更好的方法,我强烈建议您考虑查看@ jkokorian的answer。这只是展示

没有什么新东西可以添加,但我倾向于在HTML帮助程序中使用object作为可选参数,并添加new RouteValueDictionary(obj),将它们转换为KVP,您可以使用MergeAttributes添加它。

<强>代码:

public static class HtmlHelpers {
  public static MvcHtmlString ExternalLink(this HtmlHelper htmlHelper, string url, object innerHtml, object htmlAttributes = null, object dataAttributes = null) {
    var link = new TagBuilder("a");
    link.MergeAttribute("href", url);
    link.InnerHtml = innerHtml.ToString();
    link.MergeAttributes(new RouteValueDictionary(htmlAttributes), true);

    //Data attributes are definitely a nice to have.
    //I don't know of a better way of rendering them using the RouteValueDictionary however.
    if (dataAttributes != null) {
      var values = new RouteValueDictionary(dataAttributes);

      foreach (var value in values) {
        link.MergeAttribute("data-" + value.Key, value.Value.ToString());
      }
    }

    return MvcHtmlString.Create(link.ToString(TagRenderMode.Normal));
  }
}

视野中的用法:

基本构造函数:

@Html.ExternalLink("http://www.example.com", "Example!")

使用Html属性:

@Html.ExternalLink("http://www.example.com", "Example!", new { title = "Example" })

使用HTML和数据属性:

@Html.ExternalLink("http://www.example.com", "Example!", new { target = "_blank" }, new { id = 1 })

单元测试:

[TestMethod]
public void ExternalLink_Example_ShouldBeValid() {
  //Arrange
  var url = "http://www.example.com";
  var innerHtml = "Example";

  //Act
  var actual = HtmlHelpers.ExternalLink(null, url, innerHtml);

  //Assert
  actual.ToString().Should().Be(@"<a href=""http://www.example.com"">Example</a>");
}

[TestMethod]
public void ExternalLink_Example_WithHtmlAttributes_ShouldBeValid() {
  //Arrange
  var url = "http://www.example.com";
  var innerHtml = "Example";

  //Act
  var actual = HtmlHelpers.ExternalLink(null, url, innerHtml, new { title = "Example!", @class = "myLink", rel = "external", target = "_blank" });

  //Assert
  actual.ToString().Should().Be(@"<a class=""myLink"" href=""http://www.example.com"" rel=""external"" target=""_blank"" title=""Example!"">Example</a>");
}

[TestMethod]
public void ExternalLink_Example_WithDataAttributes_ShouldBeValid() {
  //Arrange
  var url = "http://www.example.com";
  var innerHtml = "Example";

  //Act
  var actual = HtmlHelpers.ExternalLink(null, url, innerHtml, new { title = "Example!" }, new { linkId = 1 });

  //Assert
  actual.ToString().Should().Be(@"<a data-linkId=""1"" href=""http://www.example.com"" title=""Example!"">Example</a>");
}

答案 2 :(得分:5)

老问题:但简单的答案 - 不确定这是否始终是一种解决方案。

@Html.RouteLink("External Link", new {}, new { href="http://www.google.com" })

很好地完成了这个伎俩 - 虽然可能有点矫枉过正。

答案 3 :(得分:1)

public static class HtmlHelpers    
{
    public static string Hyperlink(this HtmlHelper helper, string href, string text)
    {
        String.Format("<a href=\"{0}\">{1}</a>", href, text);
    }
}

会工作吗?在HtmlHelper中使用它表示扩展方法。此外,如果你想成为超酷的MVC-ish风格,你可以使用TagBuilder甚至提供目标等选项:

public static MvcHtmlString Script(this HtmlHelper helper, string href, string text, bool openInNewWindow = false)
    {
        var builder = new TagBuilder("a");
        builder.MergeAttribute("href", href);
        if(openInNewWindow)
        {
           builder.MergeAttributes("target", "_blank");
        }
        builder.SetInnerText(text);
        return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));
    }

答案 4 :(得分:0)

你需要一个html助手扩展


public static class HtmlHelpers
{ 
  public static string HyperLink(this HtmlHelper html, string text, string href) 
  {
    return string.Format(@"<a href="{0}">{1}</a>", href, text);
  }
} 

答案 5 :(得分:0)

我无法使上述解决方案起作用,并做了一些更简单的事情。

CONTROLLER

Contracts model = db.Contract
ViewBag.Link = "<a href='" + model.Link + "'>View Link</a>";

查看

@Html.Raw(System.Web.HttpUtility.HtmlDecode(ViewBag.Link))