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

本文关键字:外部 超链接 创建 HtmlHelper 何使用 | 更新日期: 2023-09-27 18:20:54

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

我要找的是一些像@Html.HyperLink("stackoverflow", "http://www.stackoverflow.com/")这样的代码,它生成这个HTML:<a href="http://www.stackoverflow.com/">stackoverflow</a>

如果这不可能的话,我总是可以手工编写HTML。

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

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

自定义帮助程序可能如下所示:

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中的第一个!

这个问题已经存在好几年了,旨在回答ASP.NET MVC v2。现在可能有更好的方法可以做到这一点,我强烈建议你考虑看看@jkokorian的答案。这只是一种很好的方式来展示你可以做什么,而不是你应该做什么

没有什么特别新的东西可以添加,但我倾向于使用object作为HTML助手上的可选参数,并添加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>");
}

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

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

做得很好——尽管可能有点过头了。

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风格,你可以使用TagBuilder,甚至提供诸如target:之类的选项

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));
    }

您需要一个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);
  }
} 

我无法使上述解决方案发挥作用,所以做了一些简单得多的事情。

控制器

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

查看

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