2009-07-24 46 views
5

Tôi đã chơi xung quanh với một số người trợ giúp html tùy chỉnh và bây giờ tôi đang cố gắng tạo một cái mà tôi có thể sử dụng cho jquery AJAX UI Tabs.Cần trợ giúp xây dựng Trình trợ giúp Html tùy chỉnh cho Asp.net MVC

Vì vậy, để làm tab ajax bạn cần phải có định dạng này trong mã html của bạn

<div id="example"> 
    <ul> 
     <li><a href="ahah_1.html"><span>Content 1</span></a></li> 
     <li><a href="ahah_2.html"><span>Content 2</span></a></li> 
     <li><a href="ahah_3.html"><span>Content 3</span></a></li> 
    </ul> 
</div> 

vì vậy tôi không thể sử dụng ActionLink bởi vì tôi không nghĩ rằng tôi có thể thêm anyway các thẻ vào ActionLink.

Vì vậy, tôi muốn tạo trình trợ giúp html của riêng mình có một actionLink với thẻ span trong đó và có thể xây dựng nó sau này để có một thẻ được liệt kê không theo thứ tự với nó.

Vì vậy, tôi không chắc chắn cách sử dụng ActionLink cho lợi ích của tôi. Giống như ActionLink có 10 phương thức quá tải và tôi không muốn tạo lại tất cả 10 phương thức đó vì điều đó dường như vô nghĩa. Vì vậy, có đi tôi có thể tham khảo nó hoặc một cái gì đó như thế?

Tôi đang sử dụng cách cho phép người trợ giúp html tùy chỉnh của tôi hiển thị khi bạn thực hiện "Html". trong intellisense.

ví dụ tôi sẽ có:

public static string Button(this HtmlHelper helper, string id, string value) 

Vì vậy, tôi không chắc chắn làm thế nào để tận dụng HtmlHelper này tôi đi qua trong

Tôi cũng không hiểu phần này của dòng. mã "trình trợ giúp HtmlHelper" này.

Điều khiến tôi nhầm lẫn là sử dụng từ khóa "this" trong tham số. Tôi không chắc nó là gì và tại sao bạn cần nó. Tôi cũng không hiểu làm thế nào bằng cách thông qua tham số này nhưng không sử dụng nó bằng cách nào đó cho phép người trợ giúp Html khách hàng của bạn được accesed bởi "Html".

Cảm ơn

Trả lời

8

Marc's answer tuyệt vời.Chỉ cần thêm một số mã:

1) Tạo lớp tĩnh với helper của bạn:

public static class MyHtmlHelpers 
{ 
    public static string MySpecialActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues) 
    { 
     var innerTagBuilder = new TagBuilder("span") { 
      InnerHtml = (!String.IsNullOrEmpty(linkText)) ? HttpUtility.HtmlEncode(linkText) : String.Empty 
     }; 

     TagBuilder tagBuilder = new TagBuilder("a") { 
      InnerHtml = innerTagBuilder.ToString(TagRenderMode.Normal); 
     }; 

     var urlHelper = new UrlHelper(html.ViewContext.RequestContext); 
     var url = urlHelper.Action(actionName, routeValues); 
     tagBuilder.MergeAttribute("href", url); 

     return tagBuilder.ToString(TagRenderMode.Normal); 
    } 
} 

2) Thêm không gian tên của lớp MyHtmlHelpers để web.config:

<pages> 
    <namespaces> 
    <add namespace="System.Web.Mvc" /> 
    <add namespace="System.Web.Mvc.Ajax" /> 
    <add namespace="System.Web.Mvc.Html" /> 
    <add namespace="System.Web.Routing" /> 
    <add namespace="System.Linq" /> 
    <add namespace="System.Collections.Generic" /> 

    <add namespace="MyHtmlHelpers_Namespace" /> 
    </namespaces> 
</pages> 

3) Thưởng thức :):

<div id="example"> 
    <ul> 
     <li><%= Html.MySpecialActionLink("Content 1", "action1", null) %></li> 
     <li><%= Html.MySpecialActionLink("Content 2", "action2", new { param2 = "value2" }) %></li> 
     <li><%= Html.MySpecialActionLink("Content 3", "action3", new { param3 = "value3" }) %></li> 
    </ul> 
</div> 
+0

Tôi sẽ dùng thử ngay khi có thể. Vì vậy, tôi đoán không có cách nào dễ dàng để sử dụng ActionLink và đó là 10 phương pháp quá tải? Tôi phải về cơ bản pic và chọn những gì tôi cần? Ngoài ra, điều này sẽ làm gì? InnerHtml = (! String.IsNullOrEmpty (linkText))? HttpUtility.HtmlEncode (linkText): String.Empty Giống như tại sao bạn HtmlEncoding nó? Tôi có thể hiểu lý do tại sao bạn kiểm tra trống nhưng không chắc chắn lý do tại sao mã hóa của bạn. – chobo2

+0

linkText phải được mã hóa HTML để tạo ra các lý do đánh dấu và bảo mật chính xác. Từ MSDN: Nếu các ký tự như khoảng trống và dấu chấm câu được truyền trong luồng HTTP, chúng có thể bị hiểu sai ở đầu nhận. Mã hóa HTML chuyển đổi các ký tự không được phép trong HTML thành các ký tự tương đương ký tự-thực thể; –

3

Các this HtmlHelper helper có nghĩa là nó là một C# 3.0 "phương pháp khuyến nông" trên HtmlHelper, đó là cách nó trở nên có sẵn trên Html dụ theo quan điểm của bạn (vv). Phương pháp mở rộng là phương pháp tĩnh giả vờ (tại thời gian biên dịch) là phương pháp thể hiện khả dụng trên loại được chỉ định bởi this (trong trường hợp này là HtmlHelper). Trên thực tế, trình biên dịch sẽ gọi phương thức tĩnh (Html.Button({args})) như thể bạn đã gõ:

MyStaticClass.Button(Html, {args}); 

Nó không phải là cần thiết sử dụng HtmlHelper được thông qua tại nếu bạn không cần đến nó (inded, tôi không sử dụng nó here); đó là công việc chính (trong trường hợp này) là làm cho mã thuận tiện để tiêu thụ (như một phương thức mở rộng); nhưng nó có thể hữu ích trong một số trường hợp.

1

Bạn không cần phải có một HtmlHelper để tạo các liên kết hoạt động với jQuery AJAX UI Tabs.

jQuery tab Plugin chấp nhận một cuộc tranh cãi mang tên tabTemplate mà bạn có thể thiết lập:

$("#example").tabs({ tabTemplate: "<li><a href=\"#{href}\">#{label}</a></li>" }); 

Xem documentation.

+0

Vì vậy, những gì tôi thực hiện chỉ là một danh sách các divs và đặt "#" infront trên tất cả các herfs? Tôi không chắc chắn mã trông như thế nào. Tôi sử dụng HtmlHelpers vì tôi thấy chúng rất sạch hơn và dừng mã spagetti đó là lý do tại sao tôi sử dụng chúng. Tôi vẫn muốn biết cách gọi một trình trợ giúp Html đã thực hiện trong trình trợ giúp Html tùy chỉnh. – chobo2

+0

Từ tài liệu được liên kết: tabTemplate: Mẫu HTML mà từ đó tab mới được tạo và thêm vào. Trình giữ chỗ # {href} và # {label} được thay thế bằng nhãn url và tab được chuyển làm đối số cho phương thức thêm. – andymeadows

+0

@ chobo2 - andymeadows là đúng. Chỉ cần tạo các tab của bạn theo bất kỳ cách nào bạn thích và sử dụng tùy chọn tabTemplate để có jQuery khớp với các liên kết (hoặc bất kỳ phần tử nào khác) mà bạn đã tạo. –

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