ASP.NET MVC: почему `ToMvcHtmlString` не является общедоступным? - PullRequest
18 голосов
/ 28 июля 2010

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

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

Ответы [ 3 ]

24 голосов
/ 07 августа 2010

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

Хотя 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));

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

8 голосов
/ 28 июля 2010

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

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

5 голосов
/ 28 июля 2010

Решает ли это вашу проблему?

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