17

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

那可能吗?

4

4 回答 4

17

Tested in Nancy version 0.23.2

Get[@"/(.*)"]作为一条包罗万象的路线,对我来说并不适用。路线"/""/foo/bar"和更长的路线不会捕获。似乎不必Get["/"]为根 URL 定义路由。似乎没有其他东西能抓住它(试过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"];
};

了解模式评分很重要。路由模式是加权的,如果两个路由匹配相同的 url 段,则得分较高的获胜。包罗万象的模式是加权0的,即使/views/{uri*}路由模式也是包罗万象的,它以一个字面量开头,它是 weighted 10000,因此它将在所有以/views开头的路由上胜出。

这是有关访问 Owin 的环境变量的更多信息。请注意,捕获的uri变量requestPath会略有不同。requestPath将以 where 开头,/因为uri变量不会。此外,如果匹配的路由模式是Get["/"], uriwill benullrequestPathwill be "/"

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

于 2014-08-04T22:59:45.950 回答
11

是的,使用正则表达式

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

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

于 2012-10-01T22:20:42.347 回答
8

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

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

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

于 2017-04-12T14:01:29.223 回答
3

@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 路线中重复了尽可能多的 '/(.*)'。

于 2014-07-11T22:52:43.690 回答