Asp.net mvc 4 在区域中使用Url.RouteUrl()和路由名称
顺便说一句,我了解整个问题,并使用名称空间使我的路由工作,所以我不认为这是一个问题 到目前为止,我有我的项目级控制器和一个用户区域,注册如下:Asp.net mvc 4 在区域中使用Url.RouteUrl()和路由名称,asp.net-mvc-4,asp.net-mvc-routing,url-routing,Asp.net Mvc 4,Asp.net Mvc Routing,Url Routing,顺便说一句,我了解整个问题,并使用名称空间使我的路由工作,所以我不认为这是一个问题 到目前为止,我有我的项目级控制器和一个用户区域,注册如下: public class UserAreaRegistration : AreaRegistration { public override string AreaName { get { return "User"; } } public over
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
相比,后者看起来更干净
理想情况下,我希望使用Url.RouteUrl(“UserHome”,new{id=5})
,在其他地方生成路由,但这总是返回为空,或者给我一个异常,说明它找不到路由名称,很明显,它就在那里
然而,当我使用Url.RouteUrl(“UserHome”,new{controller=“Home”,action=“Index”,id=5})时,
当路由映射中已经有默认值时,为什么必须指定操作和控制器?我遗漏了什么?请大家看下面@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 })
仍然可以使用。试试这个:
@Url.Action("Index", "Home", new { Area = "User" })
我可以至少用.NET 4.5.1和MVC 5.2.2来确认,这种行为已经被修复,并且现在使用
Url.RouteUrl(“UserHome”,new{id=5})
与相同的代码一样工作
这似乎是一个错误,已被修复,因为我的文章时间
添加这个作为答案,因为尽管TSmith的解决方案会起作用,但现在有了修复程序,您不再需要做额外的工作。尝试添加名称空间。在我的mvc 5.2.3[Route(“User/{id}”,Name=“UserHome”)]中,似乎不适用于属性路由。很好的答案:)