我想以更通用的方式处理这个问题,而不是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
,所以我仍然需要在两个不同的地方管理父控制器。它可以很容易地成为一个字符串参数,但我想阻止它api/crazy-non-existent-parent/5/comment/122
工作。
- 可能有一种方法可以使用反射或其他方法来即时执行此操作,而无需单独管理它,但这对我现在有用。
- 它不支持孩子的孩子。
可能有一个更通用的更好的解决方案,但就像我说的,这对我有用。