如何让表单提交到带pageNum参数的重载Cards Action方法?
问题分析
你遇到的核心问题是表单提交的目标URL不对,加上Action重载的路由匹配歧义,导致请求被导向了无参的Cards方法:
- 在
/cards/{cardname}页面中,asp-action="Cards"生成的表单提交URL是当前页面的URL(而非/cards/),提交后自然匹配到/cards/{*cardname}路由的无参方法。 - 两个
Cards方法默认都处理GET请求,但表单用的是POST方法,路由匹配逻辑出现冲突,进一步加剧了歧义。
解决方法
方法一:直接指定表单提交的目标URL(最简单有效)
去掉asp-action和asp-controller,硬编码表单的action属性为/cards/,同时把请求方法改为GET(分页查询符合REST的GET语义):
<form action="/cards/" method="get"> <input type="hidden" id="IdPageNum" name="pageNum" /> </form>
提交后URL会变成/cards/?pageNum=xxx,精准匹配带参数的Cards方法路由。
方法二:明确标记Action的Http方法与路由优先级
如果坚持用POST方法,给两个Action分别标记Http方法特性,同时确保带参数的Action路由优先级更高:
[Route("/cards/")] [HttpPost] // 明确处理POST请求 public IActionResult Cards(int pageNum) { // 业务逻辑 return View(); } [Route("/cards/{*cardname}")] [HttpGet] // 明确只处理GET请求 public IActionResult Cards() { // 业务逻辑 return View(); }
同时修改表单,用asp-route强制指定提交到/cards/路由:
<form asp-route="/cards/" method="post"> <input type="hidden" id="IdPageNum" name="pageNum" /> </form>
方法三:避免Action重载,消除路由歧义
重载Action本身容易引发路由匹配问题,建议直接使用不同的方法名或更明确的路由:
[Route("/cards/page/{pageNum:int}")] public IActionResult CardsByPage(int pageNum) { // 业务逻辑 return View(); } [Route("/cards/{*cardname}")] public IActionResult Cards() { // 业务逻辑 return View(); }
对应的表单修改为:
<form asp-action="CardsByPage" asp-controller="Home" method="get"> <input type="hidden" id="IdPageNum" name="pageNum" /> </form>
内容的提问来源于stack exchange,提问作者zibidigonzales
相关产品推荐
相关产品推荐

