Подтвердить что ты не робот

Создайте помощник texarea, который принимает содержимое представления как параметр

Я хотел бы создать html-помощник, который будет получать в качестве содержимого параметра вида, например:

<% Html.MyTextArea("txt1", () => {%> 

content of the view
<%=Html.TextBox("Name") %>
...
<% }) %>

Кто-нибудь знает, как это сделать?

4b9b3361

Ответ 2

Поскольку вы отметили его как MVC, я собираюсь предложить вам сделать что-то вроде публикации в мой блог в качестве способ получить подсветку синтаксиса для шаблонов, поскольку решение будет очень похоже, если вам не нужно манипулировать внутренним контентом и просто заинтересовано в его "обертке" (например, в содержащем элементе, который требует некоторой дополнительной логики),

Используя метод, метод HtmlHelper получает контекст блока. Синтаксис немного отличается от предложенной вами техники.

Например, у вас может быть что-то вроде:

@using(Html.MyTextArea("txt1")) 
{
  <some HTML content here>
}

Контекст передается объекту IDisposable, который включает в себя Writer (для записи в текущий выходной поток). Там он может выводить несколько элементов или выполнять другие манипуляции по мере необходимости. Dispose используется для записи элемента close (при необходимости).

Итак, у вас может получиться что-то вроде этого:

<textarea><some HTML content here></textarea>

Однако, как я уже говорил, это не обеспечивает внутренний контент самой функции.

Поскольку страницы Razor выдают наизнанку, нет эффективного метода для захвата вывода так, как вы этого хотите. Есть несколько сообщений вокруг кэширования вывода частичной строки (что будет означать, что внутренний контент в вашем примере будет в другом файле, файле .ascx), поэтому вы можете посмотреть на них.

Ответ 3

Один подход -

    public static MvcHtmlString TextArea(this HtmlHelper htmlHelper, string name, Action<TextWriter> action)
    {
        var writer = new StringWriter();
        action(writer);
        // here writer contains the html
        return htmlHelper.TextArea(name);
    }

    <%:Html.TextArea("txt1",(writer) => {
        writer.Write("content of the view");
        writer.Write(HttpUtility.HtmlEncode(Html.TextBox("Name")));
    }) %>

Ответ 4

Вы имеете в виду что-то вроде этого?

namespace System.Web.Mvc {
    public static class HtmlHelperExtensions {
        public static MvcHtmlString MyTextArea(this HtmlHelper htmlHelper, string id, Func<MvcHtmlString> helperFunc) {
            return new MvcHtmlString(string.Format("<div id=\"{0}\">{1}</div>", id, helperFunc()));
        }
    }
}

Вы можете использовать этот способ:

<%: Html.MyTextArea("txt1", () => Html.TextBox("Name", "abc")) %>