将Url.RouteUrl()与区域中的路径名称一起使用

问题描述 投票:16回答:3

作为旁注,我理解整个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 })时,它没有问题。

为什么我必须在路由映射中已经有默认值时指定操作和控制器?我错过了什么?

asp.net-mvc-4 asp.net-mvc-routing url-routing
3个回答
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 })

仍然有用。


3
投票

试试这个:

@Url.Action("Index", "Home", new { Area = "User" })

2
投票

我可以确认至少使用.NET 4.5.1和MVC 5.2.2,这种行为已得到修复,现在可以使用Url.RouteUrl("UserHome", new { id = 5 })使用相同的精确代码。

看起来这是自我发布以来修复过的错误。

将此作为答案添加,因为虽然TSmith的解决方案可行,但您现在不再需要执行额外的工作,因为有修复。

© www.soinside.com 2019 - 2024. All rights reserved.