2011-12-17 16 views
12

me gustaría crear una ayuda HTML que recibiría como contenido de los parámetros de la vista, así:crear un ayudante texarea que toma el contenido de la vista como un parámetro

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

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

nadie sabe cómo hacerlo esta ?

+1

Podrían aclarar a qué se refiere exactamente cuando usted está diciendo "que recibiría como contenido de los parámetros de la vista"? Gracias. –

+0

@KalmanSpeier significa que si tuviera un helper entre el '%><%' se renderizaría y obtendría un parámetro de cadena del html generado – Omu

+0

¿Podría mostrar un ejemplo de cuál es su entrada y salida esperada? – Rastapopulous

Respuesta

5

No estoy seguro de cómo se puede hacer de formularios Web Ver motor pero consulte este blog poste hacia fuera:

Templated Razor Delegates

+0

Phil Haack es excelente. David Fowler también. –

3

Puesto que usted ha etiquetado como MVC, voy a proponer que podría hacer algo como lo publiqué en my blog como una forma de obtener resaltado de sintaxis para las plantillas ya que la solución sería muy similar, SI no necesita manipular el contenido interno y simplemente está interesado en "envolverlo" de alguna manera (como en un elemento contenedor que requiere alguna lógica adicional).

Usando la técnica, el método HtmlHelper recibe el contexto del bloque. Sin embargo, la sintaxis es ligeramente diferente de la técnica sugerida.

Por ejemplo, usted podría tener algo como:

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

El contexto se pasa a un objeto IDisposable que incluye un escritor (por escrito a la corriente de salida de corriente). Allí, puede generar múltiples elementos o hacer otra manipulación según sea necesario. El Dispose se usa para escribir un elemento close (si es necesario).

lo tanto, usted podría terminar con algo como esto:

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

Sin embargo, como he mencionado esto no proporciona el contenido interno a la propia función.

Como las páginas Razor se procesan de adentro hacia afuera, no hay un método efectivo para obtener la salida de la manera que usted desea. Hay algunos posts alrededor del almacenamiento en caché de la salida de un parcial a una cadena (lo que significaría que el contenido interno en su ejemplo estaría en otro archivo, un archivo .ascx), por lo que es posible que desee consultarlos.

3

Un enfoque es,

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

¿Quieres decir algo como esto?

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())); 
     } 
    } 
} 

Se puede utilizar de esta manera:

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

:) no, no es un ayudante que rinde otro ayudante, es un ayudante que toma como argumento una gran parte de la vista – Omu

+0

en este caso todavía no lo entiendo, lo siento: / –

Cuestiones relacionadas