当仅在MVC中提供第一个参数时,routing参数返回null

时间:2012-11-14 04:58:14

标签: asp.net-mvc razor asp.net-mvc-4 asp.net-mvc-routing

我的问题是我在MVC中创建了一个带有三个参数的Map Route。当我提供所有三个或两个时,参数从URL传递到我的控制器。但是,当我只提供第一个参数时,它不会被传递并返回null。不确定导致此行为的原因。

路线:

        routes.MapRoute(
            name: "Details",                                              // Route name
            url: "{controller}/{action}/{param1}/{param2}/{param3}",                           // URL with parameters
            defaults: new { controller = "Details", action = "Index", param1 = UrlParameter.Optional, param2 = UrlParameter.Optional, param3 = UrlParameter.Optional }  // Parameter defaults
         );

控制器:

    public ActionResult Map(string param1, string param2, string param3)
    {

        StoreMap makeMap = new StoreMap();
        var storemap = makeMap.makeStoreMap(param1, param2, param3);
        var model = storemap;
        return View(model);
    }

当我导航到:

时,字符串param1返回null

/ StoreMap /地图/ PARAM1NAME

但是当我导航到:

时它不会返回null

/ StoreMap /地图/ PARAM1NAME / PARAM2NAME

1 个答案:

答案 0 :(得分:0)

最有可能的默认路线是干扰。我相信项目模板中定义的默认路由如下所示:

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );

只有一个参数的网址与此模式匹配,但由于您的方法签名中没有id参数,因此该值不会填充到您的任何参数中。

您可以尝试更改“详细信息”路径,将控制器硬编码为“详细信息”,如下所示,并移动它以使其位于默认路径之前:

    routes.MapRoute(
        name: "Details",                                              // Route name
        url: "Details/{action}/{param1}/{param2}/{param3}",                           // URL with parameters
        defaults: new { controller = "Details", action = "Index", param1 = UrlParameter.Optional, param2 = UrlParameter.Optional, param3 = UrlParameter.Optional }  // Parameter defaults
     );


    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );

或者,尝试将路线中的第一个参数和方法签名重命名为id

    routes.MapRoute(
        name: "Details",                                              // Route name
        url: "{controller}/{action}/{id}/{param2}/{param3}",                           // URL with parameters
        defaults: new { controller = "Details", action = "Index", id = UrlParameter.Optional, param2 = UrlParameter.Optional, param3 = UrlParameter.Optional }  // Parameter defaults
     );


public ActionResult Map(string id, string param2, string param3)
{

    StoreMap makeMap = new StoreMap();
    var storemap = makeMap.makeStoreMap(id, param2, param3);
    var model = storemap;
    return View(model);
}