【问题标题】:How to use Route in Controller Level如何在控制器级别使用路由
【发布时间】:2017-01-03 10:19:21
【问题描述】:

这里我正在尝试使用 [Route] 属性调用 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);

}

【问题讨论】:

  • 添加一个路由约束,看看它是否解决了问题[a.Route("Hello/Jan/{id:int?}")]。您可能还需要包含 Http{Verb} 即:[a.HttpGet]。尽管约定应该根据动作名称来选择它
  • 你能展示一个更完整的控制器版本吗?

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


【解决方案1】:

这是一个最小的完整可验证示例,基于您的原始帖子,说明使用属性路由时控制器的外观。

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.

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2017-05-18
    • 2015-03-12
    相关资源
    最近更新 更多