NancyFX Catch所有路线

时间:2012-10-01 19:15:54

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

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

这可能吗?

4 个答案:

答案 0 :(得分:15)

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非常重要。路线模式是加权的,如果两条路线匹配相同的网址段,则得分越高。 catch-all模式加权0,即使/views/{uri*}路由模式也是一个包罗万象的模式,它从一个加权10000的文字开始,因此它将胜出在以 / views 开头的所有路线上。

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

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

答案 1 :(得分:8)

是的,使用正则表达式

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

但是你并不需要用NancyFX来构建单页面应用程序 - 你可以使用Get和Post来使用所有的路由逻辑,但仍然只有一个页面应用程序。

答案 2 :(得分:6)

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

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

这将捕获除索引页面之外的所有路径。我不确定这是否适用于Angular的上下文,但是当我尝试用一​​个处理程序将一个简单的服务器混合在一起时,这对我有用。

答案 3 :(得分:3)

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

下面的代码适用于我的机器;):

public class IndexModule : NancyModule
{
    dynamic IndexPage() { return View["Index"]; }

    public IndexModule()
    {
        Get["/"] = _ => { return IndexPage(); };
        Get["/(.*)"] = _ => { return IndexPage(); };
        Get["/(.*)/(.*)"] = _ => { return IndexPage(); };
        Get["/(.*)/(.*)/(.*)"] = _ => { return IndexPage(); };
    }
}

我的解决方案并不完美,因为它与所有内容不匹配。我重复了与我最长的Angular路线一样多的'/(.*)'。