ASP.NET MVC Html Helper

Я пытаюсь создать несколько Html-помощников, которые будут иметь открывающий и закрывающий теги, которые будут включать другое содержимое, как это делает Html.BeginForm. Например, в Razor мы можем использовать помощник Html.BeginForm, который имеет следующий синтаксис:

    @using (Html.BeginForm())
    {
    }

Этот код будет содержать содержимое фигурных скобок внутри а и. Единственный способ, которым я решил открыть и закрыть тег с содержимым, - использовать два помощника HTML. Я определяю двух помощников HTML:

    public static MvcHtmlString StartForm(this System.Web.Mvc.HtmlHelper helper)
    {
        return new MvcHtmlString("<form>");
    }
    public static MvcHtmlString EndForm(this System.Web.Mvc.HtmlHelper helper)
    {
        return new MvcHtmlString("</form>");
    }

Затем я использую помощников, используя следующий пример:

    @Html.StartForm()
    contents
    @Html.EndForm()

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

    @using (Html.MyForm())
    {
            <text>contents</text>
    }

Может ли кто-нибудь помочь мне с этой проблемой, потому что я даже не знаю, как ее искать.

1 ответ

Решение

Вы можете определить класс так же, как MvcForm реализовано. Класс ниже позволяет вам создать тег, который содержит другие элементы.

public class MvcTag : IDisposable
{
    private string _tag;
    private bool _disposed;
    private readonly FormContext _originalFormContext;
    private readonly ViewContext _viewContext;
    private readonly TextWriter _writer;

    public MvcTag(ViewContext viewContext, string tag)
    {
        if (viewContext == null)
        {
            throw new ArgumentNullException("viewContext");
        }

        _viewContext = viewContext;
        _writer = viewContext.Writer;
        _originalFormContext = viewContext.FormContext;
        viewContext.FormContext = new FormContext();
        _tag = tag;
        Begin(); // opening the tag
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public void Begin()
    {
        _writer.Write("<" + _tag + ">");
    }

    private void End()
    {
        _writer.Write("</" + _tag + ">");
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            _disposed = true;
            End(); // Closing the tag

            if (_viewContext != null)
            {
                _viewContext.OutputClientValidation();
                _viewContext.FormContext = _originalFormContext;
            }
        }
    }

    public void EndForm()
    {
        Dispose(true);
    }
}

Чтобы использовать это MvcTag в пути MvcForm используется, мы должны определить расширение

public static class HtmlHelperExtensions
{
    public static MvcTag BeginTag(this HtmlHelper htmlHelper, string tag)
    {
        return new MvcTag(htmlHelper.ViewContext, tag);
    }
}

И это все. Теперь вы можете использовать его как:

@using(Html.BeginTag("div")) @* This creates a <div>, alternatively, you can create any tag with it ("span", "p" etc.) *@
{ 
    <p>Contents</p>
}
Другие вопросы по тегам