2009-05-18 35 views
11

Tôi có một vài trang liệt kê kết quả tìm kiếm, cho mỗi kết quả tôi muốn hiển thị, tôi muốn tạo Trình trợ giúp chế độ xem tùy chỉnh để tránh trùng lặp mã hiển thị.Làm thế nào để sử dụng ASP.NET MVC Html Helpers từ một trợ giúp tùy chỉnh?

Làm cách nào để truy cập trình trợ giúp chế độ xem hiện tại thuận tiện từ trình trợ giúp chế độ xem tùy chỉnh của tôi? I E. trong trình trợ giúp xem tùy chỉnh của tôi, tôi muốn sử dụng Url.Action(), Html.ActionLink, v.v. Làm cách nào để truy cập chúng từ trình trợ giúp chế độ xem tùy chỉnh của tôi?

using System; 
namespace MvcApp.Helpers 
{ 
    public class SearchResultHelper 
    { 
     public static string Show(Result result) 
     { 
      string str = ""; 

      // producing HTML for search result here 

      // instead of writing 
      str += String.Format("<a href=\"/showresult/{0}\">{1}</a>", result.id, result.title); 
      // I would like to use Url.Action, Html.ActionLink, etc. How? 

      return str; 
     } 
    } 
} 

using System.Web.Mvc cho phép truy cập đến HtmlHelpers, nhưng không phải những phương pháp thuận tiện như ActionLink dường như có mặt.

Trả lời

8

Ví dụ này sẽ giúp bạn. Trình trợ giúp này hiển thị văn bản liên kết khác nhau tùy thuộc vào việc người dùng có đăng nhập hay không. Nó thể hiện việc sử dụng ActionLink bên helper tùy chỉnh của tôi:

public static string FooterEditLink(this HtmlHelper helper, 
     System.Security.Principal.IIdentity user, string loginText, string logoutText) 
    { 
     if (user.IsAuthenticated) 
      return System.Web.Mvc.Html.LinkExtensions.ActionLink(helper, logoutText, "Logout", "Account", 
       new { returnurl = helper.ViewContext.HttpContext.Request.Url.AbsolutePath }, null); 
     else 
      return System.Web.Mvc.Html.LinkExtensions.ActionLink(helper, loginText, "Login", "Account", 
       new { returnurl = helper.ViewContext.HttpContext.Request.Url.AbsolutePath }, null); 
    } 

EDIT:
Tất cả các bạn sẽ cần phải làm gì để tiếp cận phương pháp Url.Action() sẽ được thay thế this HtmlHelper helper param với một cái gì đó giống như this UrlHelper urlHelp và sau đó chỉ cần gọi urlHelp.Action(...

Hy vọng điều này sẽ hữu ích.

-1

Theo ý kiến ​​của tôi, bạn không nên cố gắng sử dụng ActionLink trong mã. Toàn bộ khái niệm của MVC là tách logic khỏi màn hình, vì vậy bạn nên cố gắng gắn bó với điều đó.

Tôi khuyên bạn nên chuyển đối tượng kết quả cho đến chế độ xem (có thể thông qua Chế độ xem dữ liệu) và sau đó phân tích nội tuyến kết quả trong chế độ xem. ví dụ.

<%= Html.ActionLink(result.title,"/showresult/" + result.id, "myController") %> 
+1

Tôi thấy quan điểm của bạn và đồng ý. Tuy nhiên, điều đó có nghĩa là tôi cần phải sao chép mã/mã hiển thị/phân tích cú pháp ở một vài nơi, đó là những gì tôi cố gắng tránh. – stpe

+1

Không có lý do chính đáng tại sao một người trợ giúp html không thể gọi một người khác. –

1

Một đơn giản gravatar html helpler, lớp học của bạn cần phải được tĩnh cũng có.

public static string GetGravatarURL(this HtmlHelper helper, string email, string size, string defaultImagePath) 
    { 

     return GetGravatarURL(email, size) + string.Format("&default={0}", defaultImagePath); 

    } 
0

bạn có thể mở rộng HtmlHelper và UrlHelper mặc định chỉ bằng phương thức tiện ích (vì vậy bạn có xxxHelper làm thông số đầu tiên trong phương thức của mình).

Hoặc bạn chỉ có thể tạo chế độ xem cơ sở của mình bằng phương pháp bạn muốn và sử dụng biến Html hoặc URL của chế độ xem.

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