作为旁注,我理解整个ambiguous controller names问题,并使用命名空间来使我的路线正常工作,所以我不认为这是一个问题。
到目前为止,我有我的项目级别控制器,然后是具有以下注册的用户区域:
public class UserAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "User";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"UserHome",
"User/{id}",
new { action = "Index", controller = "Home", id = 0 },
new { controller = @"Home", id = @"\d+" }
);
context.MapRoute(
"UserDefault",
"User/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
“UserHome”路线就在那里,所以我可以允许路线/User/5
与/User/Home/Index/5
看起来更清晰IMO。
理想情况下,我想使用Url.RouteUrl("UserHome", new { id = 5 })
来生成其他地方的路线,但这总是要么空白或者给我一个例外,说它找不到路线名称,这显然就在那里。
但是,当我使用Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 })
时,它没有问题。
为什么我必须在路线映射中已经有默认值时指定操作和控制器?我错过了什么?
答案 0 :(得分:8)
每个人都请看@ ryanulit的答案如下。使用较新的框架版本可能会为您解决此问题。
不确定是否有热修复,但现在的行为有点不同。 使用您的确切代码并尝试:
Url.RouteUrl("UserHome", new { id = 5 })
我现在得到:
/User/5?httproute=True
这仍然看起来很尴尬,所以我尝试了路线并添加了另一个默认参数:
context.MapRoute(
"UserHome",
"User/{id}",
new { action = "Index", controller = "Home", area = "User", id = 0,
httproute = true },
new { controller = @"Home", id = @"\d+" }
);
现在我使用
Url.RouteUrl("UserHome", new { id = 5 })
我得到了一个很好的网址
/User/5
免责声明路由声明中可能存在httproute=true
的不良副作用。
此外,更详细的使用:
@Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 })
仍然可以。
答案 1 :(得分:3)
试试这个:
@Url.Action("Index", "Home", new { Area = "User" })
答案 2 :(得分:2)
我可以确认至少使用.NET 4.5.1和MVC 5.2.2,此行为已得到修复,现在可以使用Url.RouteUrl("UserHome", new { id = 5 })
使用相同的确切代码。
看起来这是自我发布以来修复过的错误。
添加此作为答案,因为尽管TSmith的解决方案可行,但您现在不再需要执行额外的工作,因为存在修复。