Подтвердить что ты не робот

ASP.NET MVC: Почему `ToMvcHtmlString` не является общедоступным?

Я пытаюсь написать свой собственный небольшой помощник HTML, который очень похож на DropDownListFor, но который не страдает от тех же проблем, которые у меня есть встречались раньше. Давайте не будем обсуждать, является ли недостаток DropDownListFor неправильным. Это не тот вопрос, о котором идет речь.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

В то время как 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));

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

Ответ 3

Помогает ли это решить вашу проблему?

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);
}