создать помощник textarea, который принимает содержимое представления в качестве параметра - PullRequest
12 голосов
/ 17 декабря 2011

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

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

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

Ответы [ 4 ]

5 голосов
/ 18 декабря 2011

Я не уверен, как это можно сделать в Web Forms View Engine, но посмотрите этот пост в блоге:

Шаблонные бритвенные делегаты

3 голосов
/ 03 января 2012

Вы имеете в виду что-то подобное?

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")) %>
3 голосов
/ 31 декабря 2011

Один подход,

    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")));
    }) %>
3 голосов
/ 31 декабря 2011

Поскольку вы пометили его как MVC, я собираюсь предложить вам сделать что-то вроде того, что я опубликовал на моем блоге , чтобы получить подсветку синтаксиса для шаблонов, поскольку решение будет очень похожим, ЕСЛИ вам не нужно манипулировать внутренним содержимым, и вы просто заинтересованы в том, чтобы «обернуть» его каким-то образом (например, в содержащий элемент, который требует некоторой дополнительной логики).

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...