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>
}