2012-02-06 8 views
20

Tengo un dispositivo de ayuda llamado EditableArea que proporciona al usuario un div (a través de JS) editable en tiempo de ejecución. EditableArea controles auxiliares si existe un área editable (no relacionado con MVC de Area) con el ID especificado en la DB, si es así, que representa HTML de la zona, de lo contrario, muestra de marcado predeterminado especificado como un parámetro para el ayudante:ASP.Net MVC3 - Pasar el marcado de la máquina de afeitar como parámetro

todo funciona bien, pero me gustaría cambiarlo por lo que el margen de beneficio por defecto no está especificado como una cadena, pero en la sintaxis de la maquinilla de afeitar, algo así como:

@using (Html.EditableArea(someId)) 
{ 
    <p>Click to edit contents</p> 
} 

o algo similar, al igual que la forma en @section s trabajar en MVC3.

¿Cómo puedo lograr eso?

puedo hacer una IDisposable que a su Dispose cierra la TagBuilder, etc., pero no puedo evitar haciendo que el margen de beneficio de afeitar interno incluso si el ayudante encuentra una zona con un ID (puedo borrar el contenido prestados en Dispose() pero el código dentro de {} seguiría ejecutándose, y me gustaría omitirlo.

Y si no uso using, ¿hay alguna otra forma de pasar un bloque de afeitar al ayudante, que puede o no ser realmente renderizado por el ayudante?

Respuesta

25

He aquí un ejemplo que utilizo para hacer que jQuery formato de plantilla mediante el paso de una plantilla de ID y la sintaxis de estilo de afeitar de la propia plantilla:

public static MvcHtmlString jQueryTmpl(this HtmlHelper htmlHelper, 
    string templateId, Func<object, HelperResult> template) 
{ 
    return MvcHtmlString.Create("<script id=\"" + templateId + 
     "\" type=\"x-jquery-tmpl\">" + template.Invoke(null) + "</script>"); 
} 

y esto se llamaría con

@Html.jQueryTmpl("templateId", @<text>any type of valid razor syntax here</text>) 

Básicamente solo use Func<object, HelperResult> como su parámetro y template.Invoke(null) (con argumentos si es necesario) para representarlo. Obviamente, puede omitir la llamada al .Invoke() para evitar generar el marcado "predeterminado".

+0

No funciona. La sintaxis ' ...' dentro de la llamada a la función no se reconoce (término de expresión no válida '<') –

+0

lo siento, anteponer '' con '@ '(actualicé mi respuesta) –

+1

Genial, funciona ahora.'' las etiquetas no son necesarias en absoluto ('@' es suficiente) a menos que el marcado de la maquinilla de afeitar sea de hecho texto plano sin etiquetas, de lo contrario simplemente '@' es suficiente. –

3

Solo para expandir la respuesta aceptada, ya que me tomó bastante tiempo resolver un problema similar y esta es la pregunta que surgió. Lo que realmente necesito es un @helper, que acepte texto de afeitar, ya que la plantilla debe contener bastante código. Jugué durante mucho tiempo tratando de usar varias versiones del tipo @helper item(Func<object, HelperResult> input), que encontré en la web, sin éxito. Por lo tanto yo fuimos para un enfoque como:

namespace project.MvcHtmlHelpers 
{ 
    public static class HelperExtensions 
    { 
     public static MvcHtmlString RazorToMvcString(this HtmlHelper htmlHelper, Func<object, HelperResult> template) 
     { 
      return MvcHtmlString.Create(template.Invoke(null).ToString()); 
     } 
    } 
} 

y

@project.MvcHtmlHelpers  
@helper item(other input, MvcHtmlString content) 
    { 
     <div class="item"> 
      ...other stuff... 
      <div class="content"> 
       @content 
      </div> 
     </div> 
    } 

y utilizar esta vía

@item(other input, @Html.RazorToMvcString(@<text>this is a test</text>)) 

Ahora puedo usar la plantilla de ayuda tanto para la entrada de afeitar, pero también puedo soltar vistas parciales, que es útil en algunos puntos. Como no soy un experto, podría haber mejores opciones, pero parece un enfoque flexible para mí.

Cuestiones relacionadas