6

次のルートは、BasePath の下の任意のフォルダー構造と一致します。

http://BasePath/{*SomeFolders}/ 

同じ BasePath 構造の下にある任意の zip ファイルに一致する別のルートを作成するにはどうすればよいですか?

私はこれを試しました...

http://BasePath/{*SomeFolders}/{ZipFile}

...しかし、それはエラーです

リテラル セクションやパラメーターなど、複数のセクションを含むパス セグメントには、キャッチオール パラメーターを含めることはできません。パラメータ名:routeUrl

これにどのようにアプローチすればよいですか?

*更新*

実際、元の要件には欠陥があります。{ZipFile} は、内容に関係なく最後のセクションに一致します。(ファイルまたはフォルダ)

実際には、一致させようとしているルート パターンは次のようになるはずです。

http://BasePath/{*SomeFolders}/{ZipFile}.zip
4

3 に答える 3

6

ここでは制約が答えのようです。

    routes.MapRoute( _
        "ViewFile", "BasePath/{*RestOfPath}", _
        New With {.controller = "File", .action = "DownloadFile"}, _
        New With {.RestOfPath = ".*\.zip"}
    )
    routes.MapRoute( _
        "ViewFolder", "BasePath/{*RestOfPath}", _
        New With {.controller = "Folder", .action = "ViewFolder"} _
    )

またはC#を好む人のために...

    routes.MapRoute( 
        "ViewFile", "BasePath/{*RestOfPath}", 
        new {controller = "File", action = "DownloadFile"}, 
        new {RestOfPath = @".*\.zip"}
    );
    routes.MapRoute( 
        "ViewFolder", "BasePath/{*RestOfPath}", 
        new {controller = "Folder", action = "ViewFolder"} 
    );

(ええと、私はそれが正しいと思います)

同じルートが 2 回登録されています。最初のバリエーションには、RestOfPath パラメーターが「.zip」で終わる必要があるという追加の制約が与えられています。

IRouteConstraint の派生物を使用してカスタム制約も可能であることを理解する必要があります。

于 2012-04-11T23:07:19.583 に答える
1

エラーが示すように、キャッチオールはルートの最後のパラメーターでなければなりません。

ZipFile 部分を取得するには、SomeFolders キャッチオールから解析する必要があります。

public ActionResult MyAction(string SomeFolders)
{
    // parse the ZipFile out from the SomeFolders argument
}

/folder1/folder2/folder3/file.zip がある場合は、次のようにします。

var zipFile = SomeFolders.SubString(SomeFolders.LastIndexOf("/") + 1);
于 2012-04-11T22:56:35.473 に答える