4

我正在使用 Self Hosting / OWIN 和 Razor 视图引擎运行 Nancy

具体来说:

Nancy 0.21.1
Nancy.ViewEngines.Razor 0.21.1
Microsoft Owin.SelfHost 2.0.1

我有一个带有以下脚本参考的 html 页面

<script src="Scripts/jquery-1.6.4.min.js"></script>

如果我提出以下请求(注意尾部斜杠)

http://localhost:3456/log/

正确返回 html 页面并发出以下脚本请求

http://localhost:3456/log/Scripts/jquery-1.6.4.min.js

这是正确的行为。

如果我然后提出这个请求(注意没有斜杠)

http://localhost:3456/log

正确返回了 html 页面,但是发出了不同的脚本请求。

http://localhost:3456/Scripts/jquery-1.6.4.min.js

这失败了,因为它是错误的 URL。脚本需要在 /log 下

Nancy 允许您在处理 URL 之前更改它,因此如果缺少斜杠,我尝试添加它,但这并没有改变任何东西(无论如何似乎都是 hack)

最好我想让它工作而不必担心斜杠。如果失败了,我想我需要一种方法来修改初始响应,以便返回带有斜杠的 http 引用标头?但如何做到这一点并不明显。

注意我的设置不是标准的 Nancy 设置。有一些自定义静态内容约定和视图位置约定被用来让它按我想要的方式工作。一切正常,除非尾部斜杠丢失。

这个线程似乎在谈论同样的问题,但对于 ASP.NET

http://forums.asp.net/t/1897093.aspx?Trailing+Slash+Nightmare

更新 1

正如@AndreD 所建议的,使用

/log/Scripts/jquery-1.6.4.min.js

对这两种情况都有效,但是“log”是一个变量前缀,不能硬编码。一个 html 助手可能是一个选项,这就是我目前正在寻找的解决问题的方法

4

1 回答 1

1

所以解决方案是创建一个帮助程序来创建正确的脚本路径

/log/Scripts/jquery-1.6.4.min.js

助手类扩展

*SomeNamespace*

public static class UrlHelpers
{
  public static string Script<TModel>(this Nancy.ViewEngines.Razor.UrlHelpers<TModel> Self,     string Script)
  {
    var rootPath = Self.RenderContext.Context.Request.Path.TrimEnd('/');
    var scriptPath = string.Format("{0}/Scripts/{1}", rootPath, Script);
    return scriptPath;
   }
}

看法:

@using SomeNamespace
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase
  ...
  ...

  <script src=@Url.Script("jquery-1.6.4.min.js")></script>
  <script src=@Url.Script("jquery.signalR-2.0.0.min.js")></script>
于 2013-11-09T04:40:44.590 回答