Как я могу использовать Html.BeginForm в пользовательском помощнике?

Итак, я пытаюсь преобразовать этот синтаксис бритвы в вид .cshtml в вспомогательное расширение в .cs. Здесь есть удивительный пост Дарина: qaru.site/questions/1381950/.... Тем не менее, у меня возникают проблемы с тем, чтобы он работал.

Это простая разметка

@using (Html.BeginForm("Restore", "GlobalCrud"))
{
 @Html.Hidden("entityId", "Id")
 
}

Это расширение

public static MvcHtmlString EditOrDelete(this HtmlHelper html)
{
 var s = html.BeginForm();
 return MvcHtmlString.Create(s + " additional fields " + "");
}

Это использование:

@using namespace.CustomHelper
@Html.EditOrDelete()

Это вывод:

<form method="post" action="/Completed/Manage">
System.Web.Mvc.Html.MvcForm additional fields 
</form>

Расширение помощника по большей части создает то, что мне нужно. Тем не менее, я не уверен, как мне следует преобразовать это обратно в правильную строку html. Возврат включает System.Web.Mvc.Html.MvcForm в текст. Я добавляю " additional fields " для краткости здесь, потому что там нет проблемы. Добавление есть, потому что я знаю, что нормальный оператор using, который идет с @Html.BeginForm(), добавляет тег , когда он располагает.

Как правильно вернуть форму, сгенерированную .BeginForm?

2 ответа

public static class HtmlExtensions
{
 public static void EditOrDelete(this HtmlHelper html)
 {
 using (html.BeginForm())
 {
 html.ViewContext.Writer.Write("additional fields");
 }
 }
}

а затем:

@using namespace.CustomHelper
@{Html.EditOrDelete();}

испускает:

<form action="/" method="post">additional fields</form>


Вызов BeginForm отображает тег формы, поэтому вам не нужно ничего делать, кроме вызова этого метода.

public static MvcHtmlString EditOrDelete(this HtmlHelper html)
{
 using(html.BeginForm())
 {
 return MvcHtmlString.Create(" additional fields ");
 }
}

Забастовкa >

Оператор using вызывает вызов .Dispose() до проверки метода, заставляя строку писать после тега закрывающей формы. Вместо этого напишите строку, используя html.ViewContext.Writer.Write. (см. Дарин Димитров ответ)

обертывание вызова при использовании автоматически приведет к отображению тега окончательной формы, когда вызывается Dispose.

licensed under cc by-sa 3.0 with attribution.