WebApi属性路由 - 将路由参数绑定到GET的对象

时间:2015-07-26 03:49:26

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

目前,对于每个GET,我必须从路由参数手动创建查询对象。

是否可以直接绑定到查询对象?

所以,而不是:

[Route("{id:int}")]
public Book Get(int id) {

    var query = new GetBookByIdQuery {
        Id = id
    };

    // execute query and return result
}

我可以这样做:

[Route("{id:int}")]
public Book Get(GetBookByIdQuery query) {
    // execute query and return result
}

GetBookByIdQuery的样子:

public class GetBookByIdQuery {
    public int Id { get; set;}
}

3 个答案:

答案 0 :(得分:7)

从URI中读取复杂类型,可以使用[FromUri]

    [Route("{id:int}")]
    public Book Get([FromUri] GetBookByIdQuery query) {

        // execute query and return result
    }

如果您请求api / values / 2,那么查询对象的id属性将为2;

答案 1 :(得分:3)

答案是定义您自己的HttpParameterBinding

以下是我所做的例子。

首先,我创建了CustomParameterBinding

public class CustomParameterBinding : HttpParameterBinding
{
    public CustomParameterBinding( HttpParameterDescriptor p ) : base( p ) { }

    public override System.Threading.Tasks.Task ExecuteBindingAsync( System.Web.Http.Metadata.ModelMetadataProvider metadataProvider, HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken )
    {

        // Do your custom logic here
        var id = int.Parse( actionContext.Request.RequestUri.Segments.Last() );

        // Set transformed value
        SetValue( actionContext, string.Format( "This is formatted ID value:{0}", id ) );

        var tsc = new TaskCompletionSource<object>();
        tsc.SetResult(null );
        return tsc.Task;
    }
}

下一步是创建自定义属性来装饰参数:

public class CustomParameterBindingAttribute : ParameterBindingAttribute
{
    public override HttpParameterBinding GetBinding( HttpParameterDescriptor parameter )
    {
        return new CustomParameterBinding( parameter );
    }
}

最后现在控制器看起来像:

public class ValuesController : ApiController
{
    // GET api/values/5
    [Route( "api/values/{id}" )]
    public string Get([CustomParameterBinding] string id )
    {
        return id;
    }       
}

所以现在我打电话给http://localhost:xxxx/api/values/5

我得到:&#34;这是格式化的ID值:5&#34;

答案 2 :(得分:0)

您可以使用该类作为参数,但由于id不再是方法定义中的参数,因此它不能包含在路径中。

public class LibraryController : ApiController
{
    [HttpGet]  
    public Book Get(GetBookByIdQuery query)
    {
        // Process query... & return
    }
}

您可以使用以下链接调用它:

http://localhost:54556/api/Library?id=12