2014-01-17 39 views
13

我有一个Web API的行动,如下所示:如何使用带有复杂对象参数的ASP.NET Web API属性路由?

[HttpGet] 
[Route("api/query/hello/{query}")] 
public HttpResponseMessage Hello([FromUri]Query query) 
{ 
    return null; 
} 

在查询类有一个名为QueryText公共字符串属性。当我点击以下URL时,出现404错误:

/api/query/hello?QueryText=bacon 

在我开始使用属性路由之前,这工作。如果我没有参数或原始类型参数,我可以使属性路由工作。但是,一个复杂的参数,我得到404s。属性路由如何处理复杂的动作参数?它是否与FromUri属性兼容?

+0

我不能瑞普您的方案......你可以分享你的路由配置看起来像......特别是在'内容WebApiConfig.cs' –

+5

嗯,培根.... – barrypicker

+1

@KiranChalla我想我意外地解决了我自己的问题。我推敲了示例代码。我编辑了我的问题,以反映我使用的原始代码。请注意路由模板中的{query}标记。如果我删除这个令牌,我相信它按照要求工作。 – user2719100

回答

7

这里的解决方案是Route定义中的{query}标记是多余的。删除它,如下,解决了该问题:?

[Route("api/query/hello")] 
+0

男人,我很希望我可以做一个+5!在星期五晚上一直在这里挣扎30分钟!谢谢! – dotnetguy

+0

如何通过url编码参数对http进行更改? – Zapnologica

1

因为您正在读取URL,所以需要[FromUri]属性。您的路线应该是这个样子:

public HttpResponseMessage Hello([FromUri]Query query) 
{ 
    //Implement whatever 
    return null; 
} 

/API/{控制器名称} /你好QUERYTEXT =培根

应该然后正常工作。

模型活页夹将采取您提供的任何查询参数,然后尝试绑定该对象内的任何内容。在你首先工作之后,我会担心Route Attribute。

+1

我简化了示例以更好地交流问题。实际的参数类包含比单个字符串属性多:) – user2719100

相关问题