25

我正在使用 ASP.Net MVC。这是我来自名为 Course 的控制器的代码片段:

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”,但这似乎是一个笨拙的解决方案。谢谢。

4

3 回答 3

32

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

@Url.Action("Show", "Course", new { id = "" })
于 2014-07-09T06:59:02.450 回答
15

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

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

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

于 2015-03-13T17:01:42.463 回答
10

我猜在您的路由中,您没有指定 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 时会出现错误。

于 2012-04-18T00:07:28.240 回答