【问题标题】:Make ASP.NET MVC treat a route parameter named ``id'' like any other parameter让 ASP.NET MVC 像对待任何其他参数一样对待名为“id”的路由参数
【发布时间】:2017-02-06 13:02:53
【问题描述】:

我有一个用于创建实体的 MVC 页面。完成后,我想重定向到父实体。我是这样做的:

return RedirectToAction("Edit", new { id = vm.Parent });

当我使用任何其他参数名称时,它被解释为 URL 参数:

return RedirectToAction("Edit", new { foo = vm.Parent });

呈现为/Entities/Edit?foo=234

但是 ASP MVC 选择了一个名为 id 的路由参数作为特殊情况,并且 URL 看起来像:/Entities/Edit/234。这对我不起作用,因为路由未设置为与此一起使用。我正在寻找像/Entities/Edit?id=234 这样的网址。

如何强制它以这种方式工作?路线设置:

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

【问题讨论】:

  • 在您的路线配置中,查找类似于 "{controller}/{action}/{id}" 的映射路线并将详细信息添加到您的问题中。
  • 你使用的是默认路由吗?
  • @spender 添加路由设置

标签: c# asp.net-mvc asp.net-mvc-routing url-routing


【解决方案1】:

从外观上看,您只使用了默认路由配置路由,它仅将id 指定为定义的UrlParameter。如果你想要一个自定义参数,那么你需要这样定义它:

routes.MapRoute(
    name: "ControllerName",
    url: "controllername/edit/{foo}"
);

或者,如果您希望全局使用foo 而不是id,只需更改您现有的路线:

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

或者,如果您不想要带有不必要的查询字符串参数的好看的 URL,请更改您的默认值:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多