Как HtmlHelper можно использовать для создания внешней гиперссылки? - программирование
Подтвердить что ты не робот

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

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

Я ищу код, например @Html.HyperLink("stackoverflow", "http://www.stackoverflow.com/"), который генерирует этот HTML-код: <a href="#" onclick="location.href='http://www.stackoverflow.com/'; return false;">stackoverflow</a>

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Этот вопрос несколько лет, и он был предназначен для ответа 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>");
}

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

КОНТРОЛЛЕР

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

VIEW

@Html.Raw(System.Web.HttpUtility.HtmlDecode(ViewBag.Link))