Создать используя для собственного помощника?как Html.BeginForm - PullRequest
10 голосов
/ 28 октября 2011

Мне было интересно, возможно ли создать собственное определение помощника с использованием? такой как следующий, который создает форму:

using (Html.BeginForm(params)) 
{
}

Я бы хотел сделать своего помощника таким. Итак, простой пример, который я хотел бы сделать

using(Tablehelper.Begintable(id)
{
    <th>content etc<th>
}

который будет выводить на мой взгляд

<table>
  <th>content etc<th>
</table>

Возможно ли это? если да, то как?

Спасибо

Ответы [ 2 ]

19 голосов
/ 28 октября 2011

Конечно, это возможно:

public static class HtmlExtensions
{
    private class Table : IDisposable
    {
        private readonly TextWriter _writer;
        public Table(TextWriter writer)
        {
            _writer = writer;
        }

        public void Dispose()
        {
            _writer.Write("</table>");
        }
    }

    public static IDisposable BeginTable(this HtmlHelper html, string id)
    {
        var writer = html.ViewContext.Writer;
        writer.Write(string.Format("<table id=\"{0}\">", id));
        return new Table(writer);
    }
}

, а затем:

@using(Html.BeginTable("abc"))
{
    @:<th>content etc<th>
}

даст:

<table id="abc">
    <th>content etc<th>
</table>

Я также рекомендую вам прочитать о шаблонные бритвенные делегаты .

0 голосов
/ 28 октября 2011

Да, это так; однако для использования Tablehelper.* вам потребуется создать подкласс базового представления и добавить свойство Tablehelper. Вероятно, проще добавить метод расширения к HtmlHelper:

public static SomeType BeginTable(this HtmlHelper html, string id) {
    ...
}

, что позволит вам написать:

using (Html.BeginTable(id))
{
    ...
}

, но для этого, в свою очередь, потребуются другие биты сантехники (чтобы начать элемент с BeginTable и завершить его в Dispose() возвращаемого значения).

...