Как 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. Как интересно.)
Ответы
Ответ 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))