ASP.NET MVC: Почему `ToMvcHtmlString` не является общедоступным?
Я пытаюсь написать свой собственный небольшой помощник HTML, который очень похож на DropDownListFor
, но который не страдает от тех же проблем, которые у меня есть встречались раньше. Давайте не будем обсуждать, является ли недостаток DropDownListFor
неправильным. Это не тот вопрос, о котором идет речь.
В любом случае, почему ребята MVC делают ToMvcHtmlString
внутренними и не публичными?
Ответы
Ответ 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);
}