2012-01-19 2 views
16

Точно так же, как я могу создать ActionLink в ASP.NET MVC, который указывает на действие в контроллере (например, - @Html.ActionLink("MyDisplayText", "MyAction", "MyController")), я хотел бы иметь возможность создать гиперссылку с явно определенным внешним URL-адресом.Как использовать HtmlHelper для создания внешней гиперссылки?

Что я ищу некоторый код, как @Html.HyperLink("stackoverflow", "http://www.stackoverflow.com/"), который генерирует этот HTML: <a href="http://www.stackoverflow.com/">stackoverflow</a>

Если это невозможно, то я всегда могу просто написать HTML вручную.

(Это мой первый StackOverflow вопрос. Как интересно.)

+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: '< A HREF = ' ' > stackoverflow.com переполнение стека </а >' –

+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's answer. Это просто хороший способ показать, что вы может делать, а не то, что вы должно сделать!

Ничего страшно новое не добавить, но я предпочитаю использовать object для дополнительного Params на 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>"); 
} 
0

Я не мог получить вышеуказанные решения для работы и сделал что-то гораздо проще.

CONTROLLER

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

делает трюк красиво - хотя возможно немного перехитрить.

Смежные вопросы