2012-11-07 15 views
24

Ich habe Probleme, statischen Inhalt wie JavaScript in Nancy zu dienen.Wie statische Inhalte in Nancy bereitgestellt werden

Zum Beispiel mit den self hosting sample Ich habe ein test.js auf die Ansichten Ordner hinzugefügt und habe einen

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

Tag die staticview.html Seite. Wenn ich diese Seite im Browser anschaue, wird das JavaScript korrekt ausgeführt.

Allerdings, wenn ich das Beispiel ausführen, wird das JavaScript nicht ausgeführt. Wenn ich die Seite in FireBug ansehe, sehe ich, dass ich einen 404-Fehler für test.js bekomme.

Ich habe versucht, das Hinzufügen

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

und wenn ich einen Haltepunkt gesetzt und führe Response.AsJs (Pfad) in unmittelbaren Fenstern mir einen Statuscode von NotFound

ich habe auch versucht Hinzufügen eines StaticContentConvention wie

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

Was mache ich falsch?

Antwort

34

Sie können statischen Inhalt mit NancyConventions konfigurieren. Mit dem Code des folgenden Bootstrappers können Sie alle Ihre statischen Inhalte (css/js/html/etc) in einem Ordner namens "static" im Stammverzeichnis Ihrer Anwendung platzieren.

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

Nachdem dies geschehen ist Sie eine solche statische Inhalte wie Skripte zugreifen können

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

oder css

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

Ihre Konventionen vor 'base.ConfigureConventions (nancyConventions) hinzufügen;' war der Schlüssel für mich – Suhas

+1

Markieren Sie auch die Eigenschaften der statischen Datei In Ausgabedatei kopieren = Kopieren, falls neuer – LosManos

+1

Markieren Sie auch die Eigenschaften der statischen Datei 'Copy to Output Directory = Copy if neverer' – LosManos

1

Für eine selbst gehostete Nancy App, denke ich, müssen Sie die Dateien als eingebettete Ressourcen markieren - Sie für Ansichten tun. Für Ansichten müssen Sie dies auch in Ihrem Bootstrapper tun:

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

Sie müssen wahrscheinlich etwas Ähnliches tun.

Alternativ sollten Sie (aus dem Speicher) .AsJsFile anstelle von .AsJs verwenden.

+0

Ich bin nicht klar, wenn ich Embedded Ressource einstellen muss, und wenn ich immer kopieren muss. Mit Nancy-Self-Hosting, in VS Debugging, Embedded-Ressource scheint nicht notwendig zu sein, aber Immer kopieren ist. – bbsimonbb

28

Sie müssen alle Konventionen nicht konfigurieren, wenn Sie nicht besondere Gründe haben Sie .

Nancy ... ist mit einer Standard-Konvention ausgeliefert, die für Dateien im content Pfad Ihrer Anwendung aussehen werden.

Von NancyFx | Managing static content

erreichte ich das gleiche von nur dies zu tun:

  1. einen Ordner in dem "Inhalt" genannt Projekt hinzufügen, fügen Sie die statischen Inhalte dort (Js. xap, .ico, ...)
  2. Legen Sie für jede Inhaltsdatei ihre Eigenschaften fest: Build Aktion: Eingebettete Ressourcen; In Ausgabeverzeichnis kopieren: Kopieren, wenn Neuere.
  3. Ändern Sie die Pfade den neuen Speicherort, zum Beispiel zum Spiel:

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

+1

Dies sollte als die richtige Antwort markiert werden! –

3

nur der Vollständigkeit halber hinzufügen: Wenn Sie Nancy in Selbst Host und läuft über Visual Studio Debuggen passieren zu laufen, und Sie Wenn Sie feststellen, dass Sie 404 für alle statischen Inhaltsanforderungen erhalten, müssen Sie sicherstellen, dass die Build-Aktion für alle Ihre statischen Inhaltsdateien auf "Immer kopieren" gesetzt ist!

Wenn Sie dies nicht tun, dann werden diese Dateien nicht auf Ihr Ausgabeverzeichnis kopiert werden und werden daher nicht existieren, also 404.

1

erstes jedes Mal eine Lösung Online-Sharing. Ich brauchte 4 Tage, um einen schnellen Hack zu finden, der funktionieren würde, wenn ich Tutorials durchlaufe und Nancy lerne. Hier ist die einfache Lösung:

Vergewissern Sie sich in Ihrer project.json Datei haben das richtige Setup:

"buildOptions": { 
"emitEntryPoint": true, 

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

Als nächstes gehen Sie zu Ihrem CarModule.cs:

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

beim Kompilieren der Code zum ersten Mal Ihre Ansicht wird funktionieren. Nachdem Sie jedoch die HTML bearbeiten und versuchen Sie es erneut zu kompilieren, müssen Sie diesen kleinen Hack:

Wechsel:

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

zu:

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

Wir der Compiler Trick daran denken muss befestigen das HTML zur Versammlung.

Ich hoffe, das hilft Noobs wie mich, die aus den obigen Kommentaren direkt aus der NacyFx-Dokumentation nicht viel Sinn machen kann.

Verwandte Themen