如何使用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问题。多么令人兴奋。)
自定义帮助程序可能如下所示:
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))