2012-01-19 40 views
16

Cũng giống như cách tôi có thể tạo một ActionLink trong ASP.NET MVC trỏ đến một hành động trong bộ điều khiển (ví dụ: @Html.ActionLink("MyDisplayText", "MyAction", "MyController")), tôi muốn có thể tạo siêu kết nối với một url bên ngoài được xác định rõ ràng.Làm thế nào để HtmlHelper có thể được sử dụng để tạo ra một siêu liên kết bên ngoài?

Những gì tôi đang tìm kiếm là một số mã như @Html.HyperLink("stackoverflow", "http://www.stackoverflow.com/") mà tạo ra HTML này: <a href="http://www.stackoverflow.com/">stackoverflow</a>

Nếu đây là không thể, tôi có thể luôn luôn chỉ cần viết mã HTML bằng tay.

(Đây là lần đầu tiên câu hỏi stackoverflow tôi. Làm thế nào thú vị.)

+0

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

+0

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í. –

Trả lời

16

Một helper tùy chỉnh có thể trông như thế này:

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

tháng đây là lần đầu tiên của nhiều HtmlHelpers tùy chỉnh mà bạn sử dụng!

+1

Cảm ơn một tấn! Ví dụ của bạn tạo ra HTML: '< a href = ' stackoverflow.com ' > tràn ngăn xếp </a >' –

+0

Tôi đã thay đổi kiểu trả về thành MvcHtmlString và nó hoạt động tốt. –

+0

Ah, đúng vậy. Xin lỗi, quên. Tôi đã chỉnh sửa câu trả lời của mình. – jkokorian

1
public static class HtmlHelpers  
{ 
    public static string Hyperlink(this HtmlHelper helper, string href, string text) 
    { 
     String.Format("<a href=\"{0}\">{1}</a>", href, text); 
    } 
} 

Sẽ làm việc. Sử dụng điều này trong HtmlHelper biểu thị một phương thức mở rộng. Ngoài ra nếu bạn muốn trở thành phong cách MVC-ish siêu mát mẻ, bạn có thể sử dụng các tùy chọn TagBuilder và thậm chí cung cấp như các mục tiêu:

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

phương pháp mở rộng cần phải tĩnh và chúng phải được khai báo trong lớp tĩnh –

+0

Cảm ơn, đã tắt bộ nhớ. – SventoryMang

+0

Cảm ơn sự giúp đỡ. –

0

bạn cần một phần mở rộng 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); 
    } 
} 
 

13

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

tôi không thể có được các giải pháp trên để làm việc và đã làm một cái gì đó đơn giản hơn nhiều.

CONTROLLER

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

XEM

1

Cũ câu hỏi: Nhưng câu trả lời rất đơn giản - không chắc chắn nếu điều này luôn là một giải pháp.

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

thực hiện thủ thuật độc đáo - mặc dù có thể hơi quá mức cần thiết.

Các vấn đề liên quan