Как можно использовать HtmlHelper для создания внешней гиперссылки? - PullRequest
16 голосов
/ 20 января 2012

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

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

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

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

Ответы [ 6 ]

15 голосов
/ 20 января 2012

Пользовательский помощник может выглядеть так:

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, которые вы используете!

13 голосов
/ 16 апреля 2013

Этому вопросу уже несколько лет, и он был задуман как ответ для ASP.NET MVC v2. Возможно, сейчас есть лучшие, более приятные способы сделать это, и я настоятельно рекомендую вам взглянуть на answer @ 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>");
}
5 голосов
/ 11 сентября 2014

Старый вопрос: Но простой ответ - не уверен, что это всегда было решением.

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

хорошо справляется с задачей - хотя, возможно, немного излишним.

1 голос
/ 20 января 2012
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 голосов
/ 18 июля 2014

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

CONTROLLER

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

VIEW

@Html.Raw(System.Web.HttpUtility.HtmlDecode(ViewBag.Link))
0 голосов
/ 20 января 2012

вам нужно расширение 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);
  }
} 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...