2017-01-03 48 views
2

在这里,我尝试使用调用的WebAPI控制器[路径]属性如何在控制器级别使用路由

为什么http://localhost:57997/Hello/Jan/1不是配置的路线 而http://localhost:57997/Hello/Jan获取数据

using a = System.Web.Http; 

[a.Route("Hello/Jan")] 
public IEnumerable<Department> GetDepartmets() 
{ 
    var x = pro.GetDept(); 
    return x.ToList(); 
} 

[a.Route("Hello/Jan/{id?}")] 
public HttpResponseMessage GetDepartmets(int id) 
{ 
    if (id != null) 
     { 
      var x = pro.GetDeptById(id); 
      return Request.CreateResponse(HttpStatusCode.OK, x); 
     } 
     else 
      return Request.CreateResponse(HttpStatusCode.NotFound); 

} 
+0

启用添加路由约束,看看它是否解决了这个问题'[a.Route(“你好/月/ {ID:INT ?}“)]'。你可能还需要包含Http {Verb}即:'[a.HttpGet]'。尽管公约应该根据行动名称捡起它 – Nkosi

+0

你能展示一个更完整的控制器版本吗? – Nkosi

回答

1

您的ID应匹配路由标识

[a.Route("Hello/Jan/{id}")] 
    public HttpResponseMessage GetDepartmets(int id) 
0

这里是基于原来的控制器C什么职位最小完全可验证的例子看起来像使用属性路由。

using a = System.Web.Http; 

[a.RoutePrefix("Hello/Jan")] //RoutePrefix used to group common route on controller 
public MyController : ApiController { 

    //...other code removed for brevity. ie: pro  

    //GET Hello/Jan 
    [a.HttpGet] 
    [a.Route("")] 
    public IHttpActionResult GetDepartmets() { 
     var departments = pro.GetDept().ToList(); 
     return Ok(departments); 
    } 

    //GET Hello/Jan/1 
    [a.HttpGet] 
    [a.Route("{id:int}")] //Already have a default route. No need to make this optional 
    public IHttpActionResult GetDepartmet(int id) { 
     var department = pro.GetDeptById(id); 
     if (department != null) { 
      return Ok(department); 
     } 

     return NotFound();  
    } 
} 

注:确保属性的路由在WebApiConfig

//enable attribute routing 
config.MapHttpAttributeRoutes(); 

//...before other convention-based routes.