17 votes

Comment utiliser HtmlHelper pour créer un lien hypertexte externe ?

De la même façon que je peux créer un ActionLink dans ASP.NET MVC qui pointe vers une action dans un contrôleur (par exemple - @Html.ActionLink("MyDisplayText", "MyAction", "MyController") ), j'aimerais pouvoir créer un hyperlien avec une url externe explicitement définie.

Ce que je cherche, c'est un code du genre @Html.HyperLink("stackoverflow", "http://www.stackoverflow.com/") qui génère ce HTML : <a href="http://www.stackoverflow.com/">stackoverflow</a>

Si cela n'est pas possible, je peux toujours écrire le HTML à la main.

(C'est ma première question sur stackoverflow. Comme c'est excitant).

15voto

jkokorian Points 342

Une aide personnalisée pourrait ressembler à ceci :

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

Que ce soit le premier de nombreux HtmlHelpers personnalisés que vous utiliserez !

14voto

Dan Atkinson Points 6043

Cette question date d'il y a plusieurs années et était destinée à répondre à ASP.NET MVC v2. Il existe probablement de meilleures façons de procéder aujourd'hui, et je vous conseille vivement de consulter l'article de @jkokorian sur le sujet. réponse . C'est juste une belle façon de montrer ce que vous pourrait faire, pas ce que vous devrait Faites-le !

Rien de vraiment nouveau à ajouter, mais j'ai tendance à utiliser object pour les paramètres facultatifs des aides HTML, et ajouter new RouteValueDictionary(obj) qui les transforme en un KVP que vous pouvez ajouter avec MergeAttributes .

Code :

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

Utilisation en vue :

Constructeur de base :

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

Avec des attributs Html :

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

Avec des attributs HTML et de données :

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

Tests unitaires :

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

7voto

par Points 66

Vieille question : Mais réponse simple - pas sûr que cela ait toujours été une solution.

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

fait bien l'affaire, même si c'est un peu exagéré.

1voto

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

Fonctionne. Utiliser ceci dans le HtmlHelper dénote une méthode d'extension. De plus, si vous voulez être super cool dans le style MVC, vous pouvez utiliser le TagBuilder et même fournir des options telles que la cible :

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

0voto

Vous avez besoin d'une extension html helper

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X