URL.Action 在构造 URL 时包含 id

Posted

技术标签:

【中文标题】URL.Action 在构造 URL 时包含 id【英文标题】:URL.Action includes id when constructing URL 【发布时间】:2012-04-29 07:33:26 【问题描述】:

我正在使用 ASP.Net MVC。这是我来自一个名为 Course 的控制器的代码 sn-ps:

public ActionResult List(int id)

    var viewmodel.ShowUrl = Url.Action("Show", "Course");


    ...


public ActionResult Show(int id)

  ...

viewmodel.ShowUrl 获取“id”参数的任何值。所以viewmodel.ShowUrl变成了“/Course/Show/151”(id的值为151);我希望能够根据用户交互在客户端上设置 id 部分。我希望 viewmodel.ShowUrl 的值为“/Course/Show”。

这对我来说似乎是一个错误。我没有告诉 Url.Action 包含一个 id 值。它是自己做的。如果我想设置 id 值,那么我会这样做:

var viewmodel.ShowUrl = Url.Action("Show", "Course", new id = somevalue);

那么,如何防止 MVC 添加 id 值?我可以将 viewmodel.ShowUrl 硬编码为“/Course/Show”,但这似乎是一个笨拙的解决方案。谢谢。

【问题讨论】:

我记不清了,但RoutedataViewData 上,这就是它通过的原因。我认为您可以执行Url.Action("Show", "Course", new ); 或清空ViewData 对象上的RouteData 【参考方案1】:

我猜你的路由,你没有指定 id 是一个可选参数。这是示例项目中的默认路由。

routes.MapRoute(
  "Default", // Route name
  "controller/action/id", // URL with parameters
  new  controller = "Home", action = "Index", id = UrlParameter.Optional  //Parameter defaults
);

注意包含id = UrlParameter.Optional。没有它,你会得到你所描述的行为,因为它认为 id 是强制性的。

附带说明,如果您的 Show 操作并不总是有 id,那么它应该可以为空或提供默认值。

public ActionResult Show(int? id)
public ActionResult Show(int id = 0)

否则当你尝试加载不带 id 参数的 url 时会出错。

【讨论】:

【参考方案2】:

刚刚遇到同样的问题,所以你知道,你也可以只使用一个空字符串:

@Url.Action("Show", "Course", new  id = "" )

【讨论】:

谢谢@Ben。这是唯一对我有用的。【参考方案3】:

我知道这是旧的,但我首先找到了这个,但不喜欢这些解决方案中的任何一个,所以我继续寻找并找到了https://***.com/a/19110921/1130636。

你可以使用UrlParameter.Optional来解决这个问题

Url.Action("Show", "Course", new id = UrlParameter.Optional )

【讨论】:

以上是关于URL.Action 在构造 URL 时包含 id的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 URL.Action 包含参数?

如何在@Url.Action 中传递动态值?

更改Url.Action(操作,控制器)默认功能

使用 URL 重写时的 Url.Action 不正确

尝试创建友好且“可破解”的 url 时使用 Url.Action() 时遇到问题

Url.Action 如何工作 Asp.net MVC?