2012-05-17 25 views
18

Tôi đã tìm kiếm nhưng không thể tìm thấy bất kỳ giải pháp nhanh nào cho MVC 3 htmlhelper để tạo phương thức trình bao bọc. Những gì tôi đang tìm kiếm là một cái gì đó như:MVC 3 phương pháp mở rộng htmlhelper để quấn quanh nội dung

@html.createLink("caption", "url") 
{ 
    <html> content in tags </html> 
} 

kết quả nên có

<a href="url" title="Caption"> 
    <html> content in tags </html> 
</a> 

Bất kỳ sự giúp đỡ với điều này.

+0

Bạn có hỏi liệu có thể làm điều gì đó như thế này không: '@ Html.ActionLink (" Xin chào Thế giới "," MyAction ")'? – CallumVass

+0

Không phải vậy. Tôi biết có phương pháp BeginForm() và EndForm() để xử lý kiểu kịch bản này nhưng khi thực hiện điều này trên quy mô lớn có thể gây ra vấn đề nếu bạn quên một thẻ kết thúc. – Sanj

+0

Tôi không chắc mình biết ý của bạn là gì?Bạn sẽ không sử dụng 'BeginForm' trong kịch bản này? Bạn sẽ sử dụng 'BeginForm' để tạo biểu mẫu chứ không phải liên kết anchor. – CallumVass

Trả lời

42

Cách mà điều này được thực hiện với BeginForm là kiểu trả về MvcForm impliments IDisposable để khi sử dụng trong một tuyên bố using, các Dispose phương pháp MvcForm ghi thẻ đóng </form>.

Bạn có thể viết một phương thức tiện ích mở rộng thực hiện chính xác điều tương tự.

Đây là bài tôi vừa viết để minh họa.

Trước hết, các phương pháp khuyến nông:

public static class ExtensionTest 
{ 
    public static MvcAnchor BeginLink(this HtmlHelper htmlHelper) 
    { 
     var tagBuilder = new TagBuilder("a"); 
     htmlHelper.ViewContext.Writer 
         .Write(tagBuilder.ToString(
              TagRenderMode.StartTag)); 
     return new MvcAnchor(htmlHelper.ViewContext); 
    } 
} 

Và đây là loại mới của chúng tôi, MvcAnchor:

public class MvcAnchor : IDisposable 
{ 
    private readonly TextWriter _writer; 
    public MvcAnchor(ViewContext viewContext) 
    { 
     _writer = viewContext.Writer; 
    } 

    public void Dispose() 
    { 
     this._writer.Write("</a>"); 
    } 
} 

Trong quan điểm của bạn bây giờ bạn có thể làm:

@{ 
    using (Html.BeginLink()) 
    { 
     @Html.Raw("Hello World") 
    } 
} 

Kết quả này mang lại kết quả:

<a>Hello World</a> 

Mở rộng này hơi để đối phó với yêu cầu chính xác của bạn:

public static MvcAnchor BeginLink(this HtmlHelper htmlHelper, 
            string href, 
            string title) 
{ 
    var tagBuilder = new TagBuilder("a"); 
    tagBuilder.Attributes.Add("href",href); 
    tagBuilder.Attributes.Add("title", title); 
    htmlHelper.ViewContext.Writer.Write(tagBuilder 
            .ToString(TagRenderMode.StartTag)); 
    return new MvcAnchor(htmlHelper.ViewContext); 
} 

và xem chúng tôi:

@{ 
    using (Html.BeginLink("http://stackoverflow.com", "The Worlds Best Q&A site")) 
    { 
     @Html.Raw("StackOverflow - Because we really do care") 
    } 
} 

trong đó sản lượng kết quả:

<a href="http://stackoverflow.com" title="The Worlds Best Q&amp;A site"> 
    StackOverflow - Because we really do care</a> 
+2

điều này thật đẹp. bạn vừa mới cứu tôi nửa ngày :)) –

2

Tại một cái gì đó mức độ đơn giản nhất của nó như thế này sẽ làm điều đó

public static MvcHtmlString SomeLink(this HtmlHelper htmlHelper, string href, string  title, string content) 
    { 
     var urlHelper = ((Controller)htmlHelper.ViewContext.Controller).Url; 
     //var url = urlHelper.Action(actionName, controllerName, routeValues); 

     var someLink = new TagBuilder("a"); 
     someLink.MergeAttribute("href", href); 
     someLink.InnerHtml = content; 

     return new MvcHtmlString(someLink.ToString()); 
    } 
8

Ngoài ra còn có một cách khác mà không cần dùng một lần. Đó là công việc ít hơn, tuyệt vời cho những người trợ giúp nhỏ. Tôi đã trả lời câu hỏi tương tự, và không muốn để sao chép tất cả mọi thứ, nhưng đây là một ví dụ nhỏ:

@helper Paragraph(string cssClass, Func<object, object> markup) { 
    <p class="@cssClass">@markup.DynamicInvoke(this.ViewContext)</p> 
} 

Sử dụng helper này trông như thế này:

@Paragraph("highlited", 
    @<text> 
     Look, a @Html.ActionLink("link", "index") 
    </text> 
) 

câu trả lời đầy đủ của tôi cho câu hỏi tương tự khác here.

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