我正在努力实现 this将我的应用程序路由更改为如下所示的目标:
hxxp://host/MyController/Widgets/3/AddWhatsit
此路线的 View 将帮助用户将 Whatsit 添加到 Widget 3。
同样,我希望创建新小部件的路线是:
hxxp://host/MyController/Widgets/Create
我创建了单独的路线来尝试促进这一点。他们是:
routes.MapRoute("DefaultAction",
"{controller}/{action}",
new {controller = "Home", action = "Index"});
routes.MapRoute("Default",
"{controller}/{id}/{action}",
new {controller = "Home", action = "Index", id = UrlParameter.Optional});
我遇到的问题是,当我浏览到小部件的索引页面(/MyController/Widgets,匹配“DefaultAction”路线)时,任何会引入不属于该路线的新网址参数的 ActionLink 都会被转换转换为查询字符串值。因此,例如,Widget 3 的编辑链接将呈现为:
小部件/编辑?id=3
而不是(我更喜欢的):
小部件/3/编辑
我想我知道我没有将我的(可选)id 参数放在路线末尾,从而把事情搞砸了。
我应该忍住并在路线末尾留下 id 吗?
最佳答案
这是有可能实现的。要获得类似于/Home/1/Index 的 anchor 链接,请设置如下路线:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Custom",
url: "{controller}/{id}/{action}"
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
然后,在 View 中:
@Html.ActionLink("Here", "Index", "Home", new { id = 5 }, null)
您会得到如下所示的链接:
<a href="/Home/5/Index">Here</a>
Quirk 是为了限制自定义路由。在这种情况下我删除了默认值,它们没有意义。当然还有路线的顺序。
关于asp.net-mvc - 当匹配不包含该参数的路由时,ActionLinks 恢复为查询字符串参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15557371/