2011-06-14 26 views
28

Tengo funciones en mi punto de vista que es compartido por varias páginas:funciones compartidas MVC Razor en varias vistas

@functions 
{ 
    public HtmlString ModeImage(ModeEnum mode) 
    { 
     switch(mode) 
     { 
      case AMode: new HtmlString("<img etc..."); break; 
      // more etc... 
     } 
    } 
} 

¿Hay una manera de tenerlo en un archivo separado y deben incluirse en cada página sin tener que copiar y pegarlo en cada uno. Sé que puedo escribir un archivo .cs y acceder a él por página, pero la función realmente se refiere a la vista y odio tener que recompilar si esta función cambia.

+2

¿Qué pasa con la recompilación? – SLaks

+0

¿qué hay de poner esta función adentro Vista de diseño –

+2

@Miro: Eso no funcionará. Las páginas no heredan nada de sus páginas de diseño. Después de todo, 'Layout' se establece en tiempo de ejecución. – SLaks

Respuesta

20

Parece que quiere los métodos Razor @helper descritos en la publicación del blog ASP.NET MVC3 and the @helper syntax within Razor de Scott Guthrie.

Aquí está el panorama ... "La sintaxis @helper dentro de la maquinilla de afeitar le permite crear fácilmente reutilizables métodos auxiliares que se pueden encapsular la funcionalidad de salida dentro de sus plantillas de vista. Ellos permiten una mejor reutilización de código, y también puede facilitar código más legible ".

+0

Parece que no quiere un ayudante (está volviendo vacío) – SLaks

+0

@SLaks Gracias por señalar eso ... lo perdí previamente. –

+0

Lo sentimos, es una especie de método auxiliar que devuelve una imagen html dependiendo de una enumeración. Siento que es demasiado poco para un parcial y no quiero que el código se recompile si digo, cambie el nombre del icono. Esto se parece a lo que estoy buscando. Voy a probarlo primero. – kailoon

4

Puede hacer un static helper page y poner un método normal static en la página.
Podría llamarlo escribiendo PageName.MyMethod() en cualquier lugar, y creo que no necesitará volver a compilar el proyecto.

31

(Aquí hay una versión más detallada de las respuestas existentes.)

Crear una carpeta llamada App_Code en la raíz del proyecto MVC si no existe ya. Aquí, crear una vista de afeitar vacío y el nombre de lo que quiera:

MVC project with Razor view called Shared.cshtml inside App_Code folder

Añadir @helper s y/o static métodos a que, según sea necesario:

@helper ShowSomething() 
{ 
    <span>Something</span> 
} 

@functions 
{ 
    public static int CalculateSomething() 
    { 
     return 1; 
    } 
} 

Entonces utilizarlas desde su punto de vista accediendo por primera vez a la vista compartida por su nombre:

@Shared.ShowSomething() 
@Shared.CalculateSomething() 
+0

Eso es increíble. ¿Puedes hacer lo mismo para un área? Básicamente, no se comparte en toda la base de código, sino en una sola sección. – twsmale

+0

@twsmale, no sé; Realmente no he usado áreas antes. Tal vez podrías hacer una nueva pregunta para eso. – Sam

+0

para explicar en detalle acerca de la diferencia entre ayudante y funciones y la forma de usarlas –

Cuestiones relacionadas