.Net core MVC 控制器,可选参数路由规则被空值破坏
Posted
技术标签:
【中文标题】.Net core MVC 控制器,可选参数路由规则被空值破坏【英文标题】:.Net core MVC Controller with optional parameter routing rules breaking with null values 【发布时间】:2021-05-17 16:58:09 【问题描述】:在 .net 核心应用上运行,启动设置如下所示
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "controller=Home/action=Index/id?");
);
有一个自定义控制器,控制器的定义如下所示
[Route("Purchase")]
public class InvoiceController : Controller
[HttpGet("identifier/itemsCount/overview")]
public async Task<IActionResult> GetInvoiceOverview(string identifier,int itemsCount)
A call to url like this //https://localhost:44320/invoice/20210209-0035/20/overview/
is working correctly and getting param values as
identifier=20210209-0035
itemsCount=20
我正在尝试在此列表中再添加一个可选参数,新的操作定义现在是这样的
[HttpGet("identifier/itemsCount/pagesize?/overview")]
public async Task<IActionResult> GetInvoiceOverview(string identifier,int itemsCount,string pagesize=null)
此路由规则似乎适用于 pagesize 的所有非空值,如下所示 https://localhost:44320/invoice/20210209-0035/20/11/overview/ 也在工作并获取如下参数
identifier=20210209-0035
itemsCount=20
pagesize=11
但是当尝试使用 pagesize 的 null 值进行调用时,应用程序返回 404 Page Not found 这个网址:https://localhost:44320/invoice/20210209-0035/20/overview/ => 404
这背后的原因可能是什么?
【问题讨论】:
您的概述被接受为页面大小。 我在想那个?将 pagesize 视为可选,并且 null 也使其成为可选。我应该做更多的事情吗? 路由模板中的可选参数后面不应有任何内容。重新考虑您想要的路线模板 就像 Sergey 指出的那样,当没有提供 pagesize 的值时,pagesize 变成了概览。我很想知道解决方案是什么,但你可以像这样设置你的网址"overview/identifier/itemsCount/pagesize?"
除了消除问题,我认为这样更有意义
我可以为这个动作制定多个路由规则吗?一个有pagesize,另一个没有pagesize?
【参考方案1】:
你可以尝试使用2个属性路由
[HttpGet("~/invoice/identifier/itemsCount/overview")]
[HttpGet("~/invoice/identifier/itemsCount/pagesize:int/overview")] //:int is optional
public async Task<IActionResult> GetInvoiceOverview(string identifier, int itemsCount, int? pagesize)
....
【讨论】:
以上是关于.Net core MVC 控制器,可选参数路由规则被空值破坏的主要内容,如果未能解决你的问题,请参考以下文章