2012-11-07 18 views
24

Ho problemi a pubblicare contenuto statico come JavaScript in Nancy.Come servire il contenuto statico in Nancy

Ad esempio, utilizzando il self hosting sample Ho aggiunto un test.js alla cartella Vista e ha aggiunto un tag

<script type="text/javascript" src="test.js"></script> 

alla pagina staticview.html. Se visualizzo questa pagina nel browser, JavaScript viene eseguito correttamente.

Tuttavia, quando eseguo l'esempio, JavaScript non viene eseguito. Se visualizzo la pagina in FireBug, vedo che sto ricevendo un errore 404 per test.js.

Ho provato ad aggiungere

Get["{file}"] = p => 
{ 
    string path = string.Format("Views/{0}", p.file); 
    return Response.AsJs(path); 
}; 

e quando ho impostato un punto di interruzione ed eseguire Response.AsJs (percorso) nella finestra immediata ottengo uno StatusCode di NotFound

Ho anche provato aggiungere uno StaticContentConvention come

protected override void ConfigureConventions(NancyConventions conventions) 
{ 
    base.ConfigureConventions(conventions); 
    conventions.StaticContentsConventions.Add(
     StaticContentConventionBuilder.AddDirectory("/", "Views")); 
    conventions.StaticContentsConventions.Add(
     StaticContentConventionBuilder.AddDirectory("Views", "Views")); 
} 

Cosa sto facendo male?

risposta

34

È possibile configurare il contenuto statico utilizzando NancyConventions. Utilizzando il codice dal seguente bootstrapper è possibile posizionare tutti i contenuti statici (css/js/html/etc) all'interno di una cartella denominata "statica" nella directory principale dell'applicazione.

namespace Application 
{ 
    public class ApplicationBootstrapper : DefaultNancyBootstrapper 
    { 
     protected override void ConfigureConventions(NancyConventions nancyConventions) 
     { 
      nancyConventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("Static", @"Static")); 
      base.ConfigureConventions(nancyConventions); 
     } 
    } 
} 

termine di questa operazione è possibile accedere a contenuti statici come gli script

<script type="text/javascript" src="/static/test.js"></script> 

o CSS

<link rel="stylesheet" type="text/css" href="/static/styles.css"> 
+2

Aggiungere le convenzioni prima di 'base.ConfigureConventions (nancyConventions);' era la chiave per me – Suhas

+1

Contrassegnare anche le proprietà del file statico Copia nella directory di output = Copia se più recente – LosManos

+1

Contrassegnare anche le proprietà del file statico 'Copia nella directory di output = Copia se più recente' – LosManos

1

Per un'app di Nancy auto-ospitata, penso che sia necessario contrassegnare i file come risorse incorporate, come si fa per le visualizzazioni. Per le visualizzazioni, devi anche farlo nel tuo bootstrapper:

protected override NancyInternalConfiguration InternalConfiguration 
{ 
    get 
    { 
    return NancyInternalConfiguration.WithOverrides(
     x => x.ViewLocationProvider = typeof (ResourceViewLocationProvider)); 
    } 
} 

Probabilmente devi fare qualcosa di simile.

In alternativa, è necessario (dalla memoria) utilizzare .AsJsFile anziché .AsJs.

+0

Non sono chiaro quando è necessario impostare la risorsa incorporata e quando è necessario impostare Copia sempre. Utilizzando Nancy self-hosting, nel debugging VS, la risorsa incorporata non sembra essere necessaria ma è sempre Copy Always. – bbsimonbb

28

Non è necessario configurare le convenzioni, se non si dispone di motivi particolari .

Nancy ... è fornito con una convenzione di default che cercherà i file nella content percorso della vostra applicazione.

Da NancyFx | Managing static content

ho raggiunto lo stesso da solo facendo questo:

  1. aggiungere una cartella nel progetto denominato "contenuto", aggiungere il contenuto statico lì (.js,. xap, .ico, ...
  2. Per ogni file di contenuto, impostare le relative proprietà: Build Action: Embedded Resources; Copia nella directory di output: Copia se più recente.
  3. modificare i percorsi in base alla nuova posizione, ad esempio:

<script type="text/javascript" src="content/test.js"></script>

+1

Questo dovrebbe essere contrassegnato come la risposta corretta! –

3

Aggiunta solo per completezza: Se vi capita di essere in esecuzione Nancy in serie di auto e correre via il debug di Visual Studio, e si scopri che stai ricevendo 404 per tutte le richieste di contenuto statico, devi assicurarti che l'azione di creazione sia impostata su "Copia sempre" per tutti i tuoi file di contenuti statici!

Se non si esegue questa operazione allora questi file non saranno copiati nella directory di output e quindi non esisteranno, quindi 404.

1

Prima volta ogni condivisione di una soluzione online. Mi ci sono voluti 4 giorni per trovare un trucco rapido che avrebbe funzionato mentre corro attraverso tutorial e imparo. Ecco la soluzione facile:

Assicurati di avere nel file project.json il diritto di installazione:

"buildOptions": { 
"emitEntryPoint": true, 

"copyToOutput": [ "Views/Car/*" ] 
}, 

Avanti, vai al tuo CarModule.cs:

Get("/status", _ => View["Car"]); 

quando si compila il codice per la prima volta la tua vista funzionerà. Tuttavia, dopo aver modificato il codice HTML e tenta di compilare di nuovo avete bisogno di questo piccolo hack:

Cambio:

Get("/status", _ => View["Car"]); 

a:

Get("/status", _ => View["Car.html"]); 

Abbiamo ingannare il compilatore di pensare di cui ha bisogno per attaccare l'HTML all'assembly.

Spero che questo aiuti i noobs come me che non riescono a dare molto senso ai commenti sopra riportati direttamente dalla documentazione di NacyFx.

Problemi correlati