17

NancyFX は「Catch All」ルートのような ASP.NET MVC をサポートしていますか? 基本的にすべての 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"];
};

パターン スコアリングを理解することが重要です。ルート パターンは重み付けされます。2 つのルートが同じ URL セグメントに一致する場合は、スコアが高い方が優先されます。キャッチオール パターンは重み付け0されており、/views/{uri*}ルート パターンもキャッチオールですが、重み付けされたリテラルで始まるため、 /views10000で始まるすべてのルートで優先されます。

Owin の環境変数へのアクセスの詳細については、こちらを参照してください。キャプチャされたuri変数 とrequestPathはわずかに異なることに注意してください。変数はそうではないので、 は where でrequestPath始まります。また、一致したルート パターンが の場合、は になり、は になります。/uriGet["/"]urinullrequestPath"/"

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 に答える
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 に答える