Этот вопрос несколько лет и был задуман как ответ на 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>");
}
Добро пожаловать на борт, пожалуйста, не забудьте проголосовать и пометить ответы в соответствующих случаях. Вы узнаете, что получите ответы намного лучше, если ваш% ответов будет высоким. – SventoryMang
Спасибо! Для голосов «Вверх/Вниз» требуется 15 репутаций, поэтому я пока не могу этого сделать, но я буду помнить об этом. –