控制器中的嵌套函数

时间:2014-01-05 12:27:34

标签: c# asp.net-web-api

熟悉C#的MVC和API模板的新手。

使用简单控制器的简单新WebAPI项目。像/api/Clients/1这样的网址路径,有没有办法对嵌套控制器进行排序?或者按照这样的url路径在同一个控制器中执行一个函数:/api/Clients/1/Sysinfo/typeOf

我有一个模型客户端,其中包含sysinfo项的属性。 / api / Clients / 1返回ID为1的对象Client的所有属性。我只想要使用/ api / Clients / 1 / Sysinfo / RAM返回的特定项目。


@Joachim Rosskopf 我尝试过这种方法。它导致404./ clients / 1 / works。 / clients / 1 / sysinfo不起作用。

使用以下路线:

        routes.MapRoute(
            name: "Sysinfo",
            url: "Clients/{id}/Sysinfo/{type}",
            defaults: new { controller = "Sysinfo", type = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

创建了一个新的控制器SysinfoController:

public class SysinfoController : ApiController
{
    public Sysinfo GetAllSysinfoItems()
    {
        return new Sysinfo { Id = 1, RAM = "1GB" };
    }

    public IHttpActionResult GetSysinfoByType(int id)
    {
        return Ok();
    }
}

1 个答案:

答案 0 :(得分:0)

您必须调整路由配置并为子路由添加特殊条目。首先添加最具体的路线非常重要:

routes.MapHttpRoute(
       name: "SysInfoApi",
       routeTemplate: "api/Clients/{id}/Sysinfo/{param}",
       defaults: new { controller = "SysInfo", param = RouteParameter.Optional }
);

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

在上面的示例中,有一个SysInfo控制器的特定路由,它处理嵌套资源。以及默认路线。

具有SysInfo操作的GET控制器 - 请求可能如下所示

public class SysInfoController : ApiController
{
    // GET api/client/{id}/sysinfo/
    public string Get(int id)
    {
        return "value";
    }

    // GET api/client/{id}/sysinfo/{param}
    public string Get(int id, string param)
    {
        return "value";
    }
}

我不知道在WebApi中自动处理分层资源的方法。