【问题标题】:routing paramenter returns null when only supplying first paramenter in MVC仅在 MVC 中提供第一个参数时,路由参数返回 null
【发布时间】:2012-11-14 04:58:13
【问题描述】:

我的问题是我在 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/Map/PARAM1NAME

但是当我导航到时它不会返回 null:

/StoreMap/Map/PARAM1NAME/PARAM2NAME

【问题讨论】:

  • 也许参数不是正确的术语。也许它是一个 ID。

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


【解决方案1】:

很可能默认路由有干扰。我相信项目模板中定义的默认路由是这样的:

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

只有一个参数的 URL 与此模式匹配,但由于您的方法签名中没有 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);
}

【讨论】:

  • 很好的答案!谢谢你。这就是问题所在。实际上,我通过将默认路由器放在我创建的路由器下方快速解决了这个问题。您的回答帮助我更好地理解了 MVC。
猜你喜欢
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2013-05-24
相关资源
最近更新 更多