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”,但这似乎是一个笨拙的解决方案。谢谢。
【问题讨论】:
我记不清了,但Routedata
在ViewData
上,这就是它通过的原因。我认为您可以执行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的主要内容,如果未能解决你的问题,请参考以下文章