2012-01-19 16 views
16

以同样的方式,我可以在ASP.NET MVC中创建一个指向控制器中的动作的ActionLink(例如 - @Html.ActionLink("MyDisplayText", "MyAction", "MyController")),我希望能够创建一个带有明确定义的外部URL的超链接。HtmlHelper如何用于创建外部超链接?

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

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

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

+0

欢迎登机,请不要忘记上/下投票并在适当的时候标记答案。如果你接受的答案比例很高,你会发现你会得到更好的答案。 – SventoryMang

+0

谢谢!向上/向下投票需要15个声望,所以我现在还不能这样做,但我会牢记这一点。 –

回答

16

定制的助手看起来是这样的:

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

五月这是您使用的许多自定义HtmlHelpers中的第一个!

+1

谢谢!你的例子产生HTML:'< stackoverflow.com ' >堆栈溢出</a >' –

+0

我将返回类型更改为MvcHtmlString并且它工作得很好。 –

+0

啊,没错。对不起,忘了。我编辑了我的答案。 – jkokorian

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十岁上下的风格,你可以使用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)); 
    } 
+0

扩展方法需要是静态的,它们必须在静态类中声明 –

+0

谢谢,内存不足。 – SventoryMang

+0

感谢您的帮助。 –

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

13

这个问题是几年前的,并旨在为ASP.NET MVC V2的答案。现在可能有更好,更好的方法来做到这一点,我强烈建议你考虑@ jkokorian的answer。这只是一个很好的方式来显示你可以做什么,而不是你应该做!

没有什么可怕的新的补充,但我倾向于使用object对HTML辅助可选参数,可以添加new RouteValueDictionary(obj)接着转成你可以用MergeAttributes添加KVP。

代码:

基本构造:

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

的HTML属性:鉴于

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!", 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>"); 
} 
0

我不能得到上述解决方案的工作,并做了一些简单得多。

控制器

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

VIEW

1

老问题:但答案很简单 - 不知道这是否是永远的解决方案。

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

很好地诀窍 - 虽然可能有点矫枉过正。