2009-09-18 41 views
162

Thông thường trong một cái nhìn ASP.NET người ta có thể sử dụng chức năng sau đây để có được một URL (không phải là một <a>):Tạo URL trong HTML helper

Url.Action("Action", "Controller"); 

Tuy nhiên, tôi không thể tìm thấy làm thế nào để làm điều đó từ một phong tục Trình trợ giúp HTML. Tôi có

public class MyCustomHelper 
{ 
    public static string ExtensionMethod(this HtmlHelper helper) 
    { 
    } 
} 

Biến số trợ giúp có các phương thức Hành động và tạo liên kết, nhưng chúng tạo ra số <a>. Tôi đã làm một số đào trong mã nguồn ASP.NET MVC, nhưng tôi không thể tìm thấy một cách đơn giản.

Vấn đề ở đây là Url ở trên là thành viên của lớp chế độ xem và cho bản đồ của nó cần một số bối cảnh và bản đồ tuyến đường (mà tôi không muốn xử lý và tôi không được phép). Ngoài ra, thể hiện của lớp HtmlHelper cũng có một số ngữ cảnh mà tôi giả định là một trong hai tập con của thông tin ngữ cảnh của cá thể Url (nhưng một lần nữa tôi không muốn xử lý nó). Tóm lại, tôi nghĩ rằng nó có thể nhưng vì tất cả những cách tôi có thể nhìn thấy, liên quan đến một số thao tác với một số nội dung ASP.NET nhiều hơn hoặc ít hơn, tôi tự hỏi liệu có một cách tốt hơn hay không.

Edit: Ví dụ, một khả năng tôi thấy sẽ là:

public class MyCustomHelper 
{ 
    public static string ExtensionMethod(this HtmlHelper helper) 
    { 
     UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext); 
     urlHelper.Action("Action", "Controller"); 
    } 
} 

Nhưng nó dường như không đúng. Tôi không muốn được đối phó với các trường hợp của UrlHelper bản thân mình. Nó phải là một con đường dễ dàng hơn.

+3

Tôi nhận ra đây là một ví dụ đơn giản, nhưng ví dụ được hiển thị tôi sẽ mở rộng UrlHelper thay vì HtmlHelper. Mã thực của bạn có thể cần cả hai, mặc dù. –

+0

Xin lỗi, tôi phải rõ ràng hơn: Tôi muốn thực hiện một số hiển thị HTML trong phương thức mở rộng và tôi cần tạo URL cho nó. –

Trả lời

206

Bạn có thể tạo url helper như phương pháp khuyến nông html helper này bên trong:

var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 
var url = urlHelper.Action("Home", "Index") 
+0

Ah, cảm ơn. Tôi chỉ cần đăng cùng một :-) –

+2

Tôi nghĩ rằng nó sẽ là tốt hơn nếu constructor cũng khởi tạo RouteCollection 'new UrlHelper (htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection)' – kpull1

21

Bạn cũng có thể nhận được các liên kết sử dụng UrlHelper công cộng và tĩnh lớp:

UrlHelper.GenerateUrl(null, actionName, controllerName, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true) 

Trong ví dụ này, bạn không phải tạo lớp UrlHelper mới có thể là một lợi thế nhỏ.

+0

Tôi thích câu trả lời này nhiều hơn vì đặt RouteCollection. – kpull1

9

Đây là phương pháp extenstion nhỏ của tôi để nhận UrlHelper của một trường hợp HtmlHelper:

public static partial class UrlHelperExtensions 
    { 
     /// <summary> 
     /// Gets UrlHelper for the HtmlHelper. 
     /// </summary> 
     /// <param name="htmlHelper">The HTML helper.</param> 
     /// <returns></returns> 
     public static UrlHelper UrlHelper(this HtmlHelper htmlHelper) 
     { 
      if (htmlHelper.ViewContext.Controller is Controller) 
       return ((Controller)htmlHelper.ViewContext.Controller).Url; 

      const string itemKey = "HtmlHelper_UrlHelper"; 

      if (htmlHelper.ViewContext.HttpContext.Items[itemKey] == null) 
       htmlHelper.ViewContext.HttpContext.Items[itemKey] = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection); 

      return (UrlHelper)htmlHelper.ViewContext.HttpContext.Items[itemKey]; 
     } 
    } 

Sử dụng nó như:

public static MvcHtmlString RenderManagePrintLink(this HtmlHelper helper,) 
{  
    var url = htmlHelper.UrlHelper().RouteUrl('routeName'); 
    //... 
} 

(Tôi gửi bài này ans chỉ để tham khảo)

+0

Cách tiếp cận tuyệt vời vì nó sử dụng lại một đối tượng hiện có thay vì tạo một đối tượng mới. – Mike

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