2010-07-28 26 views
17

Tôi đang cố gắng viết trình trợ giúp HTML nhỏ của riêng mình hoạt động rất giống như DropDownListFor nhưng không bị ảnh hưởng giống như problems mà tôi đã gặp trước đây. Chúng ta không thảo luận có hay không DropDownListFor là thiếu sót — đó không phải là câu hỏi này là gì.ASP.NET MVC: Tại sao `ToMvcHtmlString` không công khai?

Dù sao thì, lý do khiến các chàng trai MVC tạo ToMvcHtmlString nội bộ và không công khai là gì?

Trả lời

8

Dự đoán của tôi là khuyến khích bạn sử dụng System.Web.HtmlString để thay thế. Nhưng có, tôi đã tự hỏi điều này bản thân mình và tôi đã viết một phần mở rộng ToMvcHtmlString trùng lặp trong những người giúp đỡ của riêng tôi.

MvcHtmlString là, IIRC, chỉ sửa lỗi tương thích của chúng để MVC 2 có thể hoạt động trên cả .NET 3.5 và 4 - nhưng thậm chí sau đó sẽ hữu ích khi sử dụng trong mã của riêng bạn cho điều đó.

5

Điều này có giải quyết được sự cố của bạn không?

public static MvcHtmlString SuperDenizControl(this HtmlHelper html) 
{ 
    var builder = new TagBuilder("select"); 
    //blah blah blah amazing control 
    var control = builder.ToString(); 
    return MvcHtmlString.Create(control); 
} 
+0

Nó không phải là một vấn đề, tôi chỉ tò mò muốn biết tại sao. Tên phương thức tuyệt vời, nhân tiện! :) –

23

Tôi nghĩ rằng tôi muốn đăng một cách giải quyết dễ dàng cho những người có thể đang tìm kiếm một và vấp ngã khi câu hỏi này.

Trong khi ToMvcHtmlString là nội bộ, nó là khá dễ dàng để bỏ qua vì nó sử dụng phương pháp công cộng:

Từ nguồn MVC:

internal MvcHtmlString ToMvcHtmlString(TagRenderMode renderMode) { 
    return MvcHtmlString.Create(ToString(renderMode)); 
} 

Cả MvcHtmlString.Create và TagBuilder.ToString là công khai để chỉ cần thay thế

return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal); 

với

return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal)); 

và bạn đã sẵn sàng! Công trình tuyệt vời cho tôi. Không chắc chắn tại sao họ thậm chí còn bận tâm để tạo ra một phương pháp nội bộ riêng biệt.

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