.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 控制器,可选参数路由规则被空值破坏的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core 3 MVC Web 应用程序中设置路由

ASP.NET MVC 5 中的路由可选参数

ASP.NET MVC 2 中带有约束的可选路由参数?

如何使用可选的查询字符串参数测试 MVC 路由

NET CORE MVC - 如何使用嵌套的多参数路由

[十] ASP.NET Core MVC 中的路由