ASP.NET vNext Routing - 操作参数中的NULL值

时间:2016-01-29 16:22:16

标签: asp.net-mvc asp.net-core

以下是Routing Configuration:

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

2个动作如下:

public IActionResult ViewApplication(int applicationID, int applicationVersionID, string view)
{
    return View();
}

public IActionResult ViewApplicationSolution(int bugID, string view)
{
    return View();
}

每当调用第二个动作时,参数bugIDview都是NULL 对于第一个动作,我得到了所有3个参数。

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

我错过了Routing Configuration中的任何内容吗?

1 个答案:

答案 0 :(得分:2)

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

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

的参数之前,还要注册参数较少的参数

这应该适合您的要求。

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?}");

});