MVC路由-存在默认值时不应用查询字符串

时间:2018-11-10 20:48:14

标签: asp.net-mvc asp.net-mvc-routing

我正在使用此路由配置:

   routes.MapRoute("Default23",
                "{category}",
                new { controller = "Product", action = "List", page = 1 }
            );

这是控制器方法:

 public ViewResult List(string category, int page = 1)
{
}

但是,如果我使用:

http://localhost:44123/chess?page=2

然后我看到page=1(不是我期望的2):

enter image description here

BTw-如果我将路线更改为:

 routes.MapRoute("Default23",
                "{category}",
                new { controller = "Product", action = "List"  }
            );

然后我看到正确的值:

enter image description here

为什么会发生?我只想设置一个默认值(如果我不设置值) 。 为什么设置默认值会阻止读取查询字符串值?

1 个答案:

答案 0 :(得分:2)

为了解释这种行为,MapRoute的第三个参数是(我强调)

  

包含默认 route 值的对象。

通过指定new { controller = "Product", action = "List", page = 1 },您将为page定义路由值(即使它不是url定义中的段),并为其指定默认值1

现在,当您导航到../chess?page=2时,它将与您的Default23路线相匹配,并且'chess'的值将分配给{category}段,但没有任何内容分配给{{1} },因为page没有段(它是查询字符串值)。

执行{page}方法时,List(string category, int page = 1)将按以下顺序评估绑定值

  1. 先前绑定的动作参数(当动作是子动作时) 行动
  2. 表单值
  3. JSON请求正文(ajax调用)
  4. 路线数据
  5. 查询字符串参数
  6. 发布的文件

对于GET,1、2、3和6不适用,因此DefaultModelBinder首先评估路线数据(DefaultModelBinder)并为{{1}找到“ chess”的值}(来自url)。它还为RouteData.Values查找值“ 1”(因为您在路由定义中为其定义了默认值)。

目前您有category

然后page评估查询字符串参数(category="chess", page=1)并为DefaultModelBinder找到值“ 2”,但是由于已经设置了Request.QueryString,忽略了。默认情况下,page绑定它找到的第一个匹配项,并忽略所有后续匹配项(除非绑定到page属性)。

因此,在这一点上(绑定过程结束),您仍然有DefaultModelBinder