В ASP.NET RAZOR MVC5 существует такой замечательный хелпер как
Html.BeginForm()
Он может записываться как
@Html.BeginForm()
...
@Html.EndForm()
Так и
@using (Html.BeginForm())
{
...
}
Как создать пользовательский хелпер по такому принципу. Например мне нужен блок div, блок не голый, а в нём какие-то основные элементы, допустим пять ссылок. Мне этот блок нужно дублировать постоянно, помимо фиксированных пяти ссылок нужно внутрь пихать кучу других элементов, это может быть кнопка/таблица/картинка/и т.д. Так вот, как это можно реализовать с помощью таких же красивых фигурных скобочек, а не писать Html.MyPerfectDivStart() и Html.MyPerfectDivEnd()
Есть вариант использовать MvcHtmlString и передавать в качестве параметра List
Ответ
С формами вам не получится написать
@Html.BeginForm()
...
@Html.EndForm()
Потому что майкрософт в EndForm возвращает void, а не MvcHtmlString, и вы получите ошибку:
Error CS0029 Cannot implicitly convert type 'void' to 'object'
И нельзя иметь две перегрузки BeginForm, одна из которых возвращает строку (для вызова без using), а вторая - new MvcDiv (нужно для разворачивания в using'е).
Как сделать хелпер, аналогичный System.Web.Mvc.Html.MvcForm для вызова через using
Во-первых, сами extension для открытия/закрытия:
public static class MyDivHelper
{
public static MvcDiv BeginDiv(this HtmlHelper htmlHelper)
{
htmlHelper.ViewContext.Writer.Write("
internal static void EndDiv(ViewContext viewContext) { viewContext.Writer.Write("
Во-вторых, disposing для закрывающего div'а:
public class MvcDiv : IDisposable { private readonly ViewContext _viewContext;
public MvcDiv(ViewContext viewContext) { if (viewContext == null) throw new ArgumentNullException(nameof(viewContext));
this._viewContext = viewContext; }
public void Dispose() { MyDivHelper.EndDiv(this._viewContext); } }
Пример использования:
@using (Html.BeginDiv()) {
}
Комментариев нет:
Отправить комментарий