2010-07-28 3 views
17

Я пытаюсь написать свой собственный небольшой HTML-помощник, который действует как DropDownListFor, но который не страдает от того же problems, с которым я столкнулся раньше. Давайте не будем обсуждать, имеет ли недостаток DropDownListFor —, о котором не идет речь.ASP.NET MVC: Почему `ToMvcHtmlString` не является общедоступным?

В любом случае, в чем причина, почему ребята MVC делают ToMvcHtmlString внутренними и не публичными?

ответ

8

Мое предположение заключается в том, чтобы побудить вас использовать вместо этого System.Web.HtmlString. Но да, я подумал об этом сам, и я написал дублирующее расширение ToMvcHtmlString в своих собственных помощниках.

MvcHtmlString, IIRC, только их исправление совместимости, поэтому MVC 2 может работать как с .NET 3.5, так и с 4 - но даже тогда было бы полезно использовать в своем собственном коде для этого.

5

Это решение проблемы?

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

Это не проблема, мне просто интересно узнать, почему. Классное имя метода, кстати! :) –

23

Я думал, что опубликую легкое обходное решение для тех, кто может его искать, и наткнуться на этот вопрос.

Хотя ToMvcHtmlString внутреннее, это довольно легко обойти, как он использует публичные методы:

Из источника MVC:

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

Оба MvcHtmlString.Create и TagBuilder.ToString являются публичными, так просто заменить

return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal); 

с

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

и вы в порядке! Отлично работает для меня. Не уверен, почему они даже потрудились сделать отдельный внутренний метод.