2010-10-20 12 views
19

Sto usando Vista rasoio con asp anteprima mvc 3ASP MVC Razor visualizza i metodi di estensione, come creare metodi di visualizzazione 'globali'?

Sto cercando di creare alcuni metodi che vorrei disponibili direttamente nelle viste. Questi non sono realmente metodi helper HTML quindi non penso che l'estensione di HtmlHelper abbia senso?

il mio obiettivo, essere in grado di chiamare i metodi della vista cioè

@HelloWorld(); vs @Html.HelloWorld() 

posso ottenere Html.HelloWorld per sviluppare un metodo di estensione sul HtmlHelper

public static class HtmlExtensions 
{ 
    public static string HelloWorld(this HtmlHelper helper) 
    { 
     return "Hello"; 
    } 
} 

vorrei fare la stessa cosa ma per la vista; il mio problema: che tipo di oggetto è la vista?

Nota: Sono stato in grado di ottenere questo al lavoro, definendo i metodi nella pagina .cshtml

@functions 
{ 
    public string HelloWorld() 
    { 
     return "Hello"; 
    } 
} 

@HelloWorld() @* now this works *@ 

poi ho cercato di inserire questo codice mio file _viewstart.cshtml pensando che sarebbe stato disponibile in tutte le viste ma non

era se sapessi quale tipo la vista era penso che potrebbe essere facilmente esteso, qualsiasi aiuto apprezzato

risposta

13

si scopre, il runtime asp sta per definire il metodo Execute in fase di esecuzione, in modo che la classe base visualizzazione personalizzata deve essere anche estratto

using System; 
using System.Web.Mvc; 

namespace MyMvcWebApp.Extensions 
{ 
    public abstract class ViewBase<TModel> 
     : System.Web.Mvc.WebViewPage<TModel> where TModel : class 
    { 
     // now this will be available in any view @HelloWorld() 
     public string HelloWorld() 
     { 
      return "Hello from the ViewBase class"; 
     } 
    } 
} 

questo dovrebbe funzionare con una vista fortemente tipizzati, sembra che con rasoio tutte le viste sono fortemente battute, quando non si definisce il tipo 'dinamico' è usato e questo è il tipo forte

Inoltre, come indicato da Clicktricity, si aggiorna il web.config (quello sotto la directory Views)

<pages pageBaseType="MyMvcWebApp.Extensions.ViewBase"> 
+1

+1 . Questa è una soluzione molto migliore rispetto alla scrittura di un metodo di estensione su WebViewPage –

+6

In realtà, non sono affatto d'accordo con Noel Abrahams - è questo tipo di situazione per cui sono stati inventati i metodi di estensione. La soluzione sopra riportata significa che si dispone di una modifica alla configurazione che è necessario apportare in ogni app Web in cui si desidera utilizzarla. Inoltre, l'utilizzo di un metodo di estensione lo rende un utilizzo "pull" per le Views che vogliono usarlo, mentre cambiando la classe base forza ogni View ad ereditarlo indipendentemente dal fatto che lo voglia o meno. –

1

la classe di base predefinita per le viste Razor è specificato nel web.config si trova nella directory vista . Di solito si tratta di:

<pages pageBaseType="System.Web.Mvc.WebViewPage"> 

io non ho provato, ma vorrei suggerire che eredita da questa classe di base e aggiungendo la propria funzionalità, quindi regolare il web.config di conseguenza.

+1

Ho provato questo ma ho ottenuto un errore di compilazione -> non implementa un membro astratto ereditato 'System.Web.WebPages.WebPageExecutingBase.Execute()'; Ho bisogno di fare qualche altra ricerca; indovinando che il metodo normalmente viene generato in runtime da asp.mvc? – house9

+2

Ottengo 'WebViewPage deve essere convertibile in System.Web.UI.Page' – Clark

+0

@Clark: potrebbe trattarsi di un errore di Resharper: http://youtrack.jetbrains.net/issue/RSRP-200244?query=namespace –

12

Come sottolineato da altri, Razor Visto tutto ereditano da WebViewPage:

public abstract class WebViewPage<TModel> : WebViewPage 

È possibile quindi semplicemente scrivere i vostri metodi di estensione per WebViewPage senza creare una nuova classe di base o modificare i file di configurazione, che è stato suggerito da altre risposte Per esempio:

public static class WebViewPageExtensions 
{ 
    public static string HollowWorld(this WebViewPage wvp) 
    { 
     return "Memento mori"; 
    } 
} 

Aggiungi un'istruzione using per questo spazio dei nomi per la vista e poi:

<p>@this.HollowWorld()</p> 
+0

Se alcuni membri della community di ASP.NET Core sono incappati in questo thread, la classe da estendere qui è: RazorPage anziché WebViewPage. –

1

Il modo migliore per chiamare un metodo con gli argomenti che utilizzano il motore di rasoio è quello di utilizzare aiutanti. Esempio: consenti @MakeNote (contenuto stringa)

Quindi nella pagina cshtml devi solo chiamare @MakeNote ("Ciao") e dovresti stare bene.

Stavo diventando pazzo quando stavo avendo problemi quindi google mi ha mandato a questa pagina ma non ha aiutato. Stavo cercando di caricare il contenuto in html <select> con L2E usando il rasoio.

Il segreto è creare un helper in app_code, quindi utilizzare con cshtml.

Problemi correlati