1

これは私の別の質問のより具体的なバージョンです: Restful MVC Web Api Inheritance、これに対する答えが私がそれに答えるのに役立つことを願っています。

ASP.NET Web API を使用しています。
次のようなものをルーティングできるようにしたいと考えています[{object}/{id}]/{controller}/{id}
だから私は/{id}、「API エンドポイント」で終わるオプションのオブジェクトの配列が必要です。

これらをルーティングできるようにしたい:
/houses
/houses/3
suburbs/3/houses
council/5/suburbs/houses
city/8/council/suburbs/houses
ETC

get(List<restRoute>parents, int id){
    ...
}

restRoute は、オブジェクトの文字列と、id のオプションの int (または GUID など) を持つオブジェクトになります。

どこから始めればよいか誰か知っていますか?
すべてを個別にルーティングしたくありません。

4

2 に答える 2

2

ASP.NET MVC のボックスからのルーティングにもこのような問題がありました。一般的なルーティングとして使用するのには適していますが、カスタム ルーティングにはそれほど柔軟ではありません。

WCF Web Api (CTP バージョンの ASP.NET Web API) では、属性ベースのルーティングが使用されていました。

より柔軟だと思いますが、マイナス点として、各メソッドにはルーティング属性が必要です。

このブログ投稿を見てください。

http://www.strathweb.com/2012/05/attribute-based-routing-in-asp-net-web-api/

ASP.NET Web Api を使用して属性ベースのルーティングを実装する方法について説明します。このようなアプローチは、メソッドにマップできるルートに対してより柔軟であるため、役立つ場合があります。

于 2012-07-21T13:36:38.050 に答える
1

{*anything} ルートで可変セグメント化された URLパターンを使用して、分割を処理し、URL のどの部分がメソッド内のどのビットのデータに対応するかを把握できます。

Global.asax:

routes.MapRoute(
            "Special", // name
            "{*allthethings}", // parameters
            new { controller = "Special", action = "Sauce" } // defaults
        );

SpecialController:

public ActionResult Sauce()
{
    string data = RouteData.Values["allthethings"].ToString();
    string[] items = data.Split('/');
    foreach (string item in items)
    {
        // do whatever you need to figure out which is what!
    }

    return View();
}

少し賢くしたい場合は、独自のカスタム RouteHandler を作成して分割を行うことができます。David Ebb の PK routehandler のようなものは、ルートの処理における要件に合わせてカスタマイズすることで、おそらくうまくいくでしょう。これを使用して、「allthethings」パラメーターを分割しList<RestRoute>、リクエストをコントローラーに渡す前にフォーマットに変換できます。

于 2012-07-23T11:43:46.433 に答える