2011-12-17 2 views
12

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

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

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

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

+1

Не могли бы вы уточнить, что вы имеете в виду, когда именно вы говорите «что бы получить в качестве содержимого параметра зрения»? Благодарю. –

+0

@KalmanSpeier означает, что если бы у вас был помощник между '%><%', он бы визуализировал бы и вы получили бы строковый параметр сгенерированного html – Omu

+0

Не могли бы вы показать пример того, что ваш вход и ожидаемый результат? – Rastapopulous

ответ

5

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

Templated Razor Delegates

+0

Phil Haack отлично. Дэвид Фоулер тоже. –

3

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

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

Например, вы могли бы иметь что-то вроде:

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

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

Таким образом, вы могли бы в конечном итоге с чем-то вроде этого:

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

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

Поскольку страницы Razor выдают наизнанку, нет эффективного способа захвата вывода так, как вы этого хотите. Есть около posts вокруг кэширования вывода частичной строки (что будет означать, что внутренний контент в вашем примере будет в другом файле, файле .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"))); 
    }) %> 
3

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

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")) %> 
+0

:) Нет, это не помощник, который оказывает другого помощника, это помощник, который принимает в качестве аргумента большую часть взгляда – Omu

+0

, в этом случае я все еще не понимаю, извините: / –

Смежные вопросы