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
です。
- リフレクションなどを使用して、個別に管理せずにオンザフライでこれを行う方法はおそらくありますが、これは今のところうまくいきます。
- 子供たちの子供たちをサポートしていません。
より一般的なより良い解決策があるかもしれませんが、私が言ったように、これは私にとってはうまくいきます。