URL.Action在构造URL时包含id

Tom*_*eck 23 asp.net-mvc-routing url.action asp.net-mvc-3

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

public ActionResult List(int id)
{
    var viewmodel.ShowUrl = Url.Action("Show", "Course");


    ...
}

public ActionResult Show(int id)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

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});
Run Code Online (Sandbox Code Playgroud)

那么,你如何阻止MVC添加id值?我可以将viewmodel.ShowUrl硬编码为"/ Course/Show",但这似乎是一个kludgy解决方案.谢谢.

Ben*_*ull 27

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

@Url.Action("Show", "Course", new { id = "" })
Run Code Online (Sandbox Code Playgroud)


bor*_*gas 12

我知道这是旧的,但我先发现了这个,但不喜欢任何这些解决方案,所以我一直在寻找并找到/sf/answers/1337764501/.

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

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


DMu*_*gan 8

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

routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional } //Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)

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

另外,如果您的Show操作并不总是具有id,那么它应该可以为空或提供默认值.

public ActionResult Show(int? id)
public ActionResult Show(int id = 0)
Run Code Online (Sandbox Code Playgroud)

否则,当您尝试加载没有id参数的url时,您将收到错误.