28

我无法在 Nancy 中提供静态内容,例如 JavaScript。

例如使用自托管示例,我在 Views 文件夹中添加了一个 test.js 并添加了一个

<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"));
}

我究竟做错了什么?

4

5 回答 5

38

您可以使用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">
于 2012-11-22T17:45:14.873 回答
30

如果您没有特殊原因,您不必配置任何约定。

Nancy ... 附带了一个默认约定,它将在 content您的应用程序路径中查找文件。

来自NancyFx | 管理静态内容

我通过这样做也达到了同样的效果:

  1. 在项目中添加一个名为“content”的文件夹,在其中添加静态内容(.js、.xap、.ico、...)
  2. 对于每个内容文件,设置其属性:Build Action : Embedded Resources;复制到输出目录:如果较新则复制。
  3. 更改路径以匹配新位置,例如:

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

于 2013-02-28T09:03:09.880 回答
4

添加只是为了完整性:如果您碰巧在自己的主机中运行 Nancy 并通过 Visual Studio 调试运行,并且您发现所有静态内容请求都得到 404,您必须确保构建操作设置为“始终复制” " 用于您的所有静态内容文件!

如果您不这样做,那么这些文件将不会被复制到您的输出目录,因此将不存在,因此 404。

于 2015-04-27T19:29:04.017 回答
1

对于自托管的 Nancy 应用程序,我认为您需要将文件标记为嵌入式资源 - 您为视图做。对于视图,您还需要在引导程序中执行此操作:

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

您可能必须做类似的事情。

或者,您应该(从记忆中)使用 .AsJsFile 而不是 .AsJs。

于 2012-11-07T13:07:44.803 回答
1

第一次在线分享解决方案。我花了 4 天时间才找到一个快速的 hack,它可以在我浏览教程和学习 nancy 时起作用。这是简单的解决方案:

确保您的 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 附加到程序集。

我希望这可以帮助像我这样的菜鸟,这些菜鸟不能直接从 NacyFx 文档中的上述评论中获得太大的工作意义。

于 2017-04-05T14:41:44.583 回答