我正在使用此路由配置:
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):
BTw-如果我将路线更改为:
routes.MapRoute("Default23",
"{category}",
new { controller = "Product", action = "List" }
);
然后我看到正确的值:
为什么会发生?我只想设置一个默认值(如果我不设置值) 。 为什么设置默认值会阻止读取查询字符串值?
答案 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)
将按以下顺序评估绑定值
对于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
。