从url读取Asp.Net Web api GET值

时间:2013-09-23 10:06:10

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

我正在尝试将/{Controller}/{Variable1}/{Variable2}/{Variable3}映射到控制器中的GET方法

public TestController{

public ActionResult Get([FromUrl] Entity instance){}

}

所以我需要将变量映射到实体。

把它放到一个例子中

  

/产品/ {类别} / {过滤器1} / {过滤器2} /

实体

 public class ProductSearchRequest
{ 
       public string Category{get;set;}   
       public string filter1 {get;set;}
       public string filter2 {get;set;}
}

控制器

public ProductController: Controller {
public ActionResult GET([FromUri] ProductSearchRequest productSearchRequest){

}

}

[EDITED]

必须进行以下更改才能实现此功能

而不是RouteCollection.MapHttpRoute使用HttpConfiguration.Routes.MapHttpRoute,因为这是API路由而不是MVC路由。

从ApiController继承控制器,而不是以前的Controller。

1 个答案:

答案 0 :(得分:0)

基本上你无法做到这一点。复杂类型与路由机制不兼容。

阅读this文章。但是这一段解释了为什么路由机制不能满足你的要求。

  

复杂类型只能通过自定义绑定绑定到URI。但   在那种情况下,框架无法事先知道是否   参数将绑定到特定的URI。要找出它,它需要   调用绑定。选择算法的目标是   在调用any之前,从静态描述中选择一个动作   绑定。因此,从匹配中排除复杂类型   算法

因此基本规则是:

  

对于动作的每个参数,如果参数取自   URI,然后必须在路由中找到参数名称   字典或URI查询字符串。 (可选参数和   排除复杂类型的参数。)

这意味着你需要像这样定义你的行动:

public ActionResult GET(string Category, string filter1, string filter2){
}

您的路线模板:

/{controller}/{category}/{filter1}/{filter2}/