2012-04-17 77 views
20

我正在使用ASP.Net MVC。这里是我的代码片段从命名课程控制器:当构建URL时,URL.Action包含id

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

+0

我不能确切地remeber但'Routedata'是'ViewData',这就是为什么它的通过。我认为你可以在'ViewData'对象上做'Url.Action(“Show”,“Course”,new {});'或者清空'RouteData'。 – 2013-08-12 17:15:46

回答

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时,您会收到错误消息。

19

在同样的问题时只需来了,让你知道,你也可以只使用一个空字符串:

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

我知道这是老了,但我发现这个第一,但不喜欢任何的这些解决方案,所以我一直在寻找,发现https://stackoverflow.com/a/19110921/1130636

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

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