Câu hỏi này nhiều tuổi và đã được dự định như là một câu trả lời cho ASP.NET MVC v2. Có lẽ những cách tốt hơn, đẹp hơn để thực hiện việc này ngay bây giờ và tôi thực sự khuyên bạn nên cân nhắc xem số answer của @ jkokorian. Đây chỉ là cách hay để hiển thị những gì bạn có thể làm, chứ không phải những gì bạn nên làm!
Không có gì khủng khiếp mới để thêm, nhưng tôi có xu hướng sử dụng object
cho params tùy chọn trên những người giúp đỡ HTML, và thêm new RouteValueDictionary(obj)
mà biến chúng thành một KVP mà bạn có thể thêm với 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));
}
}
Cách sử dụng theo quan điểm:
constructor cơ bản:
@Html.ExternalLink("http://www.example.com", "Example!")
Với Html thuộc tính:
@Html.ExternalLink("http://www.example.com", "Example!", new { title = "Example" })
Với HTML và dữ liệu thuộc tính:
@Html.ExternalLink("http://www.example.com", "Example!", new { target = "_blank" }, new { id = 1 })
Đơn vị kiểm tra:
[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>");
}
Chào mừng bạn lên tàu, xin đừng quên lên/xuống bỏ phiếu và đánh dấu câu trả lời nếu thích hợp. Bạn sẽ nhận ra rằng bạn sẽ nhận được phản hồi tốt hơn nhiều nếu% câu trả lời của bạn được chấp nhận là cao. – SventoryMang
Cảm ơn! Lên/xuống phiếu yêu cầu 15 danh tiếng, vì vậy tôi không thể làm điều đó chỉ được nêu ra, nhưng tôi sẽ giữ cho rằng trong tâm trí. –