【问题标题】:NancyFX Catch All routeNancyFX Catch All 路线
【发布时间】:2012-09-22 16:08:48
【问题描述】:

NancyFX 是否支持 ASP.NET MVC,例如“Catch All”路由?我需要一个,基本上匹配每个 URL。这对于构建单页应用程序非常方便。

这可能吗?

【问题讨论】:

    标签: url-routing single-page-application nancy


    【解决方案1】:

    Tested in Nancy version 0.23.2

    Get[@"/(.*)"] 不适用于我作为包罗万象的路线。路线 "/""/foo/bar" 和更长的路线不会捕获。似乎无需为根 URL 定义 Get["/"] 路由。似乎没有其他东西能抓住它(尝试过Get["{uri*}"])。以下是我最终定义路由的方式(请记住,我是为 Angular 应用程序执行此操作):

    Get["/views/{uri*}"] = _ => { return "A partial view..."; };
    Get["/"] =
    Get["/{uri*}"] = _ =>
    {
        var uri = (string)_.uri;// The captured route
        // If you're using OWIN, you can also get a reference to the captured route with:
        var environment = this.Context.GetOwinEnvironment();// GetOwinEnvironment is in the 'Nancy.Owin' namespace
        var requestPath = (string)environment["owin.RequestPath"];
        return View["views/defaultLayout.html"];
    };
    

    了解Pattern Scoring 很重要。路由模式是加权的,如果两个路由匹配相同的 url 段,则得分较高的获胜。全能模式的权重为0,即使/views/{uri*} 路由模式也是全能模式,它以文字开头,权重为10000,因此它将在所有以/views.

    这里有更多关于Accessing Owin's Environment Variables的信息。请注意,捕获的uri 变量和requestPath 会略有不同。 requestPath 将以 / 开头,而 uri 变量不会。此外,如果匹配的路由模式是Get["/"],则uri 将是nullrequestPath 将是"/"

    Views 路由将根据 url 路径返回部分 h​​tml 文件,所有其他路由将返回将引导 SPA 的默认布局页面。

    【讨论】:

      【解决方案2】:

      是的,使用正则表达式

      Get[@"/(.*)"] = parameters => {
          return View["viewname", parameters];
      };
      

      但您并不真的需要它来使用 NancyFX 构建单页应用程序 - 您可以将 Get 和 Post 与您的所有路由逻辑一起使用,并且仍然拥有一个单页应用程序。

      【讨论】:

      • 谢谢,它成功了。为什么我需要它,因为我有启用了推送状态的 Backbone-powered SPA。然后我路由到 SPA 内的 localhost:8080/some/1 页面 - 一切正常。但是我可以复制URL并发送给朋友,当他尝试打开时,他会得到404。所以,我需要捕获所有路由并处理master.html视图,重置是由JS构建的。
      • 详情见代码here
      【解决方案3】:

      @synhershko 的解决方案对他们不起作用的更新答案。试试:

      Get[@"^(.*)$"] = parameters => {
          return "hi";
      };
      

      这将捕获除索引页面之外的所有路径。我不确定这是否可以在 Angular 的上下文中使用,但是当我尝试使用一个处理程序来破解一个简单的服务器时,这对我有用。

      【讨论】:

      • 这应该是 NancyFx > 2.0 的答案
      【解决方案4】:

      @synhershko 提供的答案对我不起作用。它不处理 /users/2 或任何其他包含更多段的路由。

      下面的代码可以在我的机器上运行;):

      public class IndexModule : NancyModule
      {
          dynamic IndexPage() { return View["Index"]; }
      
          public IndexModule()
          {
              Get["/"] = _ => { return IndexPage(); };
              Get["/(.*)"] = _ => { return IndexPage(); };
              Get["/(.*)/(.*)"] = _ => { return IndexPage(); };
              Get["/(.*)/(.*)/(.*)"] = _ => { return IndexPage(); };
          }
      }
      

      我的解决方案并不完美,因为它不匹配一切。我在最长的 Angular 路线中重复了尽可能多的 '/(.*)'。

      【讨论】:

      • IndexPage 方法应该返回Negotiator,这就是View[...] 返回的内容。我还将传入参数变量以访问它:public Negotiator GetIndexPage(dynamic _) {...}; 然后您可以在所有方法上引用它:Get["/"] = IndexPage; 等...或者只是让它们失败而不是定义 IndexPage 方法: Get["/"] = Get["/(.*)"] = ... = _ => { ... }; 但我会完全避免多管齐下并使用Get["/"] = Get["/{uri*}"] = _ => { ... }; 更多详细信息,请参阅我的答案。
      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 2021-02-18
      • 2015-04-06
      • 2011-12-28
      • 1970-01-01
      • 2010-12-19
      • 2020-07-20
      • 1970-01-01
      相关资源
      最近更新 更多