URL.Action在构造URL时包含id

时间:2012-04-17 22:23:22

标签: asp.net-mvc-3 asp.net-mvc-routing url.action

我正在使用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”,但这似乎是一个kludgy解决方案。感谢。

3 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:11)

我知道这已经过时了,但我先找到了这个,但不喜欢这些解决方案,所以我一直在寻找https://stackoverflow.com/a/19110921/1130636

您可以使用UrlParameter.Optional来解决此问题

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

答案 2 :(得分:7)

我猜你的路由,你没有指定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时,您将收到错误。

相关问题