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”)]中,似乎不适用于属性路由。很好的答案:)