Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Хелперы ASP.NET RAZOR MVC5 для использования с using

#c_sharp #aspnet_mvc #mvc #razor


В ASP.NET RAZOR MVC5 существует такой замечательный хелпер как 

Html.BeginForm()


Он может записываться как 

@Html.BeginForm()
...
@Html.EndForm()


Так и 

@using (Html.BeginForm())
{
    ...
}


Как создать пользовательский хелпер по такому принципу. Например мне нужен блок div,
блок не голый, а в нём какие-то основные элементы, допустим пять ссылок. Мне этот блок
нужно дублировать постоянно, помимо фиксированных пяти ссылок нужно внутрь пихать кучу
других элементов, это может быть кнопка/таблица/картинка/и т.д. Так вот, как это можно
реализовать с помощью таких же красивых фигурных скобочек, а не писать Html.MyPerfectDivStart()
и Html.MyPerfectDivEnd()

Есть вариант использовать MvcHtmlString и передавать в качестве параметра List
из разных других компонентов, созданных мною. Но это некрасиво смотрится! 
    


Ответы

Ответ 1



С формами вам не получится написать @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("
"); return new MvcDiv(htmlHelper.ViewContext); } 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()) { }

Комментариев нет:

Отправить комментарий