ASP.NET Core Html Helper рендеринг необработанного текста вместо отформатированного HTML с помощью TagBuilder - PullRequest
0 голосов
/ 04 октября 2018

Я работаю над Html Helper для создания элемента управления, который будет состоять из нескольких элементов, построение с использованием TagBuilder s.Сам элемент управления будет отображаться с использованием TagBuilder, который содержит div со всеми дочерними элементами.

Для этого: https://developercommunity.visualstudio.com/content/problem/17287/tagbuilder-tostring-returns-the-type-of-tagbuilder.html

Я реализовал метод Render() для созданияконтролировать и возвращать его как string:

public class MyCustomControl
{
    public override string ToString()
    {
        return Render();
    }

    private string Render()
    {
        TagBuilder mainContainer = new TagBuilder("div");

        // Generate child elements and append to mainContainer...

        using (StringWriter writer = new StringWriter())
        {
            mainContainer.WriteTo(writer, HtmlEncoder.Default);

            return writer.ToString();
        }
    }
}

И создал метод расширения для вызова его в представлении Razor:

public static MyCustomControl(this IHtmlHelper html)
{
    return new MyCustomControl();
}

И включить его в представления следующим образом:

@(Html.MyCustomControl()
)

Проблема в том, что вместо рендеринга html я получаю вывод необработанного html-текста в View, поэтому я вижу:

<div><!-- all child controls html here --></div>

Вместо того, чтобы там был элемент.

1 Ответ

0 голосов
/ 04 октября 2018

Вам нужно вернуть экземпляр IHtmlContent вместо string:

public static class HtmlHelperExtension {
    public static IHtmlContent MyCustomControl(this IHtmlHelper html)
    {
        var result = new MyCustomControl();
        return html.Raw(result.Render());
    }
}

Контрольный пример:

public class MyCustomControl
{
    public override string ToString()
    {
        return Render();
    }

    public string Render()
    {
        TagBuilder mainContainer = new TagBuilder("div");
        mainContainer.Attributes.Add(new KeyValuePair<string, string>("data-id","123") );

        // Generate child elements and append to mainContainer...

        using (StringWriter writer = new StringWriter())
        {
            mainContainer.WriteTo(writer, HtmlEncoder.Default);

            var result=writer.ToString();
            return result;
        }
    }

результат будет:

<div data-id="123"></div>
...