Asp.net mvc ASP.NET vNext路由-操作参数中的空值

Asp.net mvc ASP.NET vNext路由-操作参数中的空值,asp.net-mvc,asp.net-core,Asp.net Mvc,Asp.net Core,下面是路由配置: app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Dashboard}/{action=Index}"); routes.MapRoute( name: "Sample", template: "{controller=SampleApplication}/{action=ViewA

下面是
路由配置:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Dashboard}/{action=Index}");

    routes.MapRoute(
        name: "Sample",
        template: "{controller=SampleApplication}/{action=ViewApplication}/{applicationID?}/{applicationVersionID?}/{view?}");

    routes.MapRoute(
        name: "SampleSolution",
        template: "{controller=SampleApplication}/{action=ViewApplicationSolution}/{bugID?}/{view?}");
});
为便于理解,映射将参考以下内容:

Route 1: http://site/Dashboard/Index

Route 2: http://site/SampleApplication/ViewApplication/1/2/ViewName

Route 3: http://site/SampleApplication/ViewApplicationSolution/1/ViewName
public IActionResult ViewApplication(int applicationID, int applicationVersionID, string view)
{
    return View();
}

public IActionResult ViewApplicationSolution(int bugID, string view)
{
    return View();
}
这两项行动如下:

Route 1: http://site/Dashboard/Index

Route 2: http://site/SampleApplication/ViewApplication/1/2/ViewName

Route 3: http://site/SampleApplication/ViewApplicationSolution/1/ViewName
public IActionResult ViewApplication(int applicationID, int applicationVersionID, string view)
{
    return View();
}

public IActionResult ViewApplicationSolution(int bugID, string view)
{
    return View();
}
无论何时调用第二个操作,参数
bugID
view
都是
NULL
对于第一个动作,我将获得所有3个参数

在路由配置中,如果我交换路由2和路由3的位置,我将在第二个操作中获得2个参数值。但是对于第一个操作,所有3个参数都是
NULL


我是否错过了
路由配置

与您当前的路由定义中的任何内容,当请求
ViewApplicationSolution/1/ViewName
时,它与路由2的定义匹配(因为我们指定其他2个参数为空)。因此,参数
1
将实际映射到动作方法的
applicationID
参数(如果存在)。您可以将
ViewApplicationSolution
操作方法的
BugID
参数重命名为
applicationID
,并查看您的参数是否有值。此外,如果您从路由模式中删除
(表示参数可为空),它也会起作用,因为您的请求将与这些模式中的一个完全匹配,因为我们现在没有任何可选参数

注册路线的顺序非常重要。因此,请确保在通用默认路由之前注册特定路由。同时,在参数较多(相同类型)的参数之前,先注册参数较少的参数

这应该适用于您的请求

app.UseMvc(routes =>
{

    routes.MapRoute(name: "SampleSolution",
        template: "{controller=Settings}/{action=ViewApplicationSolution}/
                                                              {bugID?}/{view?}");

    routes.MapRoute(name: "Sample",
        template: "{controller=Settings}/{action=ViewApplication}/{applicationID?}/
                                                       {applicationVersionID?}/{view?}");



    routes.MapRoute(name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");

});

对于当前路由定义,当请求
ViewApplicationSolution/1/ViewName
时,它与路由2的定义匹配(因为我们指定其他2个参数为空)。因此,参数
1
将实际映射到动作方法的
applicationID
参数(如果存在)。您可以将
ViewApplicationSolution
操作方法的
BugID
参数重命名为
applicationID
,并查看您的参数是否有值。此外,如果您从路由模式中删除
(表示参数可为空),它也会起作用,因为您的请求将与这些模式中的一个完全匹配,因为我们现在没有任何可选参数

注册路线的顺序非常重要。因此,请确保在通用默认路由之前注册特定路由。同时,在参数较多(相同类型)的参数之前,先注册参数较少的参数

这应该适用于您的请求

app.UseMvc(routes =>
{

    routes.MapRoute(name: "SampleSolution",
        template: "{controller=Settings}/{action=ViewApplicationSolution}/
                                                              {bugID?}/{view?}");

    routes.MapRoute(name: "Sample",
        template: "{controller=Settings}/{action=ViewApplication}/{applicationID?}/
                                                       {applicationVersionID?}/{view?}");



    routes.MapRoute(name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");

});

@Shyju,+1表示“路线定义的顺序真的很重要”。@Shyju,我看到了你的答案并实现了它。现在,这个答案不见了:(。我想接受这个答案。这两条路由工作正常。控制器有一个JsonResult[HttpGet]方法。它的参数现在为空。我是否也应该为此添加路由?或者应该更改HttpGet的路由配置?我对该问题有错误的解释。现在更正。Thanks@Shyju,+1表示“路线定义的顺序真的很重要”。@Shyju,我看到了你的答案并实施了它。现在,这个答案不见了:(.我想接受这个答案。这两条路由工作正常。控制器有一个JsonResult[HttpGet]方法。它的参数现在为空。我应该为这个添加路由吗?或者应该为HttpGet更改路由配置吗?我对该问题有错误的解释。现在更正。ThanksI看到了更新的答案并实现了它。这两个路由工作正常。控制器有一个JsonResult[HttpGet]方法。它是通过JavaScript调用的。它的参数现在为空。我是否也应该为此添加路由?除非你真的想要漂亮(SEO友好的URL),您不需要像这样定义自定义url模式。您的默认路由定义足够好。请确保使用与参数名称匹配的正确querystring键。我看到了更新的答案并实现了它。这两个路由工作正常。控制器有一个JsonResult[HttpGet]方法。它是通过JavaScript调用的。它的参数现在为空。我是否也应该为此添加路由?除非你真的想要漂亮(SEO友好的URL),您不需要像这样定义自定义url模式。您的默认路由定义足够好。请确保使用与参数名称匹配的正确查询字符串键。