我在Nancy中提供JavaScript等静态内容时遇到了麻烦。
例如使用self hosting sample我已将一个test.js添加到Views文件夹并添加了
<script type="text/javascript" src="test.js"></script>
标记到staticview.html页面。如果我在浏览器中查看此页面,则JavaScript会正确执行。
然而,当我运行示例时,JavaScript不会被执行。如果我在FireBug中查看该页面,我发现我收到了test.js的404错误。
我尝试过添加
Get["{file}"] = p =>
{
string path = string.Format("Views/{0}", p.file);
return Response.AsJs(path);
};
当我设置一个断点并在即时窗口中执行Response.AsJs(path)时,我得到一个NotFound的StatusCode
我还尝试添加一个StaticContentConvention,例如
protected override void ConfigureConventions(NancyConventions conventions)
{
base.ConfigureConventions(conventions);
conventions.StaticContentsConventions.Add(
StaticContentConventionBuilder.AddDirectory("/", "Views"));
conventions.StaticContentsConventions.Add(
StaticContentConventionBuilder.AddDirectory("Views", "Views"));
}
我做错了什么?
答案 0 :(得分:37)
您可以使用NancyConventions
配置静态内容。使用以下引导程序中的代码,您可以将所有静态内容(css / js / html / etc)放在应用程序根目录下名为“static”的文件夹中。
namespace Application
{
public class ApplicationBootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureConventions(NancyConventions nancyConventions)
{
nancyConventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("Static", @"Static"));
base.ConfigureConventions(nancyConventions);
}
}
}
完成此操作后,您可以访问静态内容,例如脚本
<script type="text/javascript" src="/static/test.js"></script>
或css
<link rel="stylesheet" type="text/css" href="/static/styles.css">
答案 1 :(得分:28)
如果没有特殊原因,则无需配置任何约定。
南希......是
附带一个默认约定,将在中查找文件
申请的content
路径。
我通过这样做实现了同样的目标:
<script type="text/javascript" src="content/test.js"></script>
答案 2 :(得分:3)
仅为完整性而添加:如果您正好在自己的主机中运行Nancy并通过Visual Studio调试运行,并且您发现所有静态内容请求都获得了404,那么您必须确保构建操作设置为&#34;始终复制&#34;对于所有静态内容文件!
如果您不这样做,那么这些文件将不会被复制到您的输出目录,因此将不存在,因此404.
答案 3 :(得分:1)
对于自托管的Nancy应用,我认为您需要将这些文件标记为嵌入式资源 - 您可以为视图执行此操作。对于视图,您还需要在引导程序中执行此操作:
protected override NancyInternalConfiguration InternalConfiguration
{
get
{
return NancyInternalConfiguration.WithOverrides(
x => x.ViewLocationProvider = typeof (ResourceViewLocationProvider));
}
}
你可能需要做类似的事情。
或者你应该(从内存中)使用.AsJsFile而不是.AsJs。
答案 4 :(得分:1)
首次在线分享解决方案。我花了4天的时间才找到一个快速的黑客,当我浏览教程和学习南希时,它会起作用。这是一个简单的解决方案:
确保你的project.json文件中有正确的设置:
"buildOptions": {
"emitEntryPoint": true,
"copyToOutput": [ "Views/Car/*" ]
},
接下来,转到CarModule.cs:
Get("/status", _ => View["Car"]);
第一次编译代码时,您的视图将起作用。但是,在您编辑html并尝试再次编译之后,您需要这个小小的黑客:
更改:
Get("/status", _ => View["Car"]);
到:
Get("/status", _ => View["Car.html"]);
我们欺骗编译器认为它需要将HTML附加到程序集。
我希望这可以帮助像我一样的noobs从NacyFx文档中直接从上述评论中获得很多工作意义。