38

現在、私は2つのコントローラーを持っています

1 - 親コントローラー

2 - 子コントローラー

このように親コントローラーにアクセスします

someurl\parentcontroller

今、私はこのように子供のコントローラーにアクセスしたい

someurl\parentcontroller\1\childcontroller

この最後の URL は、特定の親のすべての子を返す必要があります。

現在、global.asax ファイルにこのルートがあります

routes.MapHttpRoute ("Route1", "{controller}/{id}", new { id = RouteParameter.Optional });

階層を達成する方法がわかりませんparent\id\child。これを達成するには、ルートをどのように構成すればよいですか? アイデア?

4

4 に答える 4

32

以下のようにルートを設定します。{param}はオプションです(必要に応じて使用してください)。

routes.MapHttpRoute(
           name: "childapi",
           routeTemplate: "api/Parent/{id}/Child/{param}",
           defaults: new { controller = "Child", param = RouteParameter.Optional }
  );

routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         defaults: new { id = RouteParameter.Optional }
  );

次に、子APiを/ api / Parent / 1/childと呼びます。親は/api/Parent/のように単純に呼び出すことができます。

子コントローラー:

    public class ChildController : ApiController
    {     
        public string Get(int id)
        {
          //the id is id between parent/{id}/child  
          return "value";
        }
        .......
    }
于 2012-05-28T12:11:31.363 に答える
19

Web API 2 以降、ルート属性を使用してメソッドごとにカスタム ルーティングを定義できるようになりました。

[Route("api/customers/{id:guid}/orders")]
public IEnumerable<Order> GetCustomerOrders(Guid id) {
   return new Order[0];
}

また、次の行を WebApiConfig.Register() 初期化メソッドに追加する必要があります。

  config.MapHttpAttributeRoutes();

記事全文、 http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

于 2014-11-13T11:19:46.067 に答える
10

controller = "Child"Abhijit Kadamのように、ChildControllerを直接接続するのではなく、より一般的な方法でこれを処理したかったのです。controller = "ChildX"私にはいくつかの子コントローラーがあり、それぞれに特定のルートを何度も何度もマップする必要はありませんでしcontroller = "ChildY"た。

WebApiConfigはこのように見えます:

config.Routes.MapHttpRoute(
  name: "DefaultApi",
  routeTemplate: "api/{controller}/{id}",
  defaults: new { id = RouteParameter.Optional }
);
  config.Routes.MapHttpRoute(
  name: "ChildApi",
  routeTemplate: "api/{parentController}/{parentId}/{controller}/{id}",
  defaults: new { id = RouteParameter.Optional }
);

私の親コントローラーは非常に標準的であり、上記のデフォルトルートと一致します。サンプルの子コントローラーは次のようになります。

public class CommentController : ApiController
{
    // GET api/product/5/comment
    public string Get(ParentController parentController, string parentId)
    {
        return "This is the comment controller with parent of "
        + parentId + ", which is a " + parentController.ToString();
    }
    // GET api/product/5/comment/122
    public string Get(ParentController parentController, string parentId,
        string id)
    {
        return "You are looking for comment " + id + " under parent "
            + parentId + ", which is a "
            + parentController.ToString();
    }
}
public enum ParentController
{
    Product
}

私の実装のいくつかの欠点

  • ご覧のとおり、私はを使用したenumので、2つの別々の場所で親コントローラーを管理する必要があります。簡単に文字列パラメータにすることもできますが、機能しないようにしたかったのapi/crazy-non-existent-parent/5/comment/122です。
  • リフレクションなどを使用して、個別に管理せずにオンザフライでこれを行う方法はおそらくありますが、これは今のところうまくいきます。
  • 子供たちの子供たちをサポートしていません。

より一般的なより良い解決策があるかもしれませんが、私が言ったように、これは私にとってはうまくいきます。

于 2013-03-11T15:00:49.893 に答える
5

デフォルトの mvc ルーティングを使用する以外のオプションは、属性ルーティングを確認することです - https://github.com/mccalltd/AttributeRouting。手間はかかりますが、個々のアクション メソッドをデコレートすると、複雑なルートを設計する必要がある場合に非常に柔軟になります。標準の MVC ルーティングと組み合わせて使用​​することもできます。

于 2012-05-28T23:09:54.933 に答える