1

在 ASP MVC3 项目中调用:-

<h2><a href="@Url.RouteUrl("_ScientificPrograms", new { idProgramaSeleccionado = @programa.Id, nombrePrograma = @programa.NombreProgramaUrl(), IdiomaSeleccion = idioma })">@programa.NombrePrograma(@idioma)</a></h2>

对应于 Global.asax.cs 文件中的注册路由:-

routes.MapRoute(
             "_ScientificPrograms", // Route name
             "{IdiomaSeleccion}/research/scientific-programmes/{idProgramaSeleccionado}/{nombrePrograma}/{idGrupoSeleccionado}/{nombreGrupo}", 
             new { controller = "Research", action = "ScientificProgrammes", IdiomaSeleccion = UrlParameter.Optional, idProgramaSeleccionado = UrlParameter.Optional, nombreGrupo = UrlParameter.Optional, idGrupoSeleccionado = UrlParameter.Optional, nombrePrograma = UrlParameter.Optional } 
         );

在我的本地机器上运行良好,生成如下网址:-

http://localhost/es/research/scientific-programmes/1/molecular-oncology

但是,在部署网站时,相同的调用只会产生

http://deployedsite/es/research/

虽然进入

http://deployedsite/es/research/scientific-programmes/1/molecular-oncology

确实正确解析了页面。

在我自己的测试主机和我的客户 QA 服务器上都观察到相同的行为。其他路由调用工作正常,但似乎这个有点特别。

4

2 回答 2

2

您可能已经解决了这个问题或继续前进,但我会将这些信息放在这里以防其他人遇到您的问题,因为他们正遭受导致此问题的相同 MVC3 错误。

事实证明,根据 Phil Haack 的这篇博客文章UrlParameter.Optional,连续参数会导致 MVC3 中的一个小错误。

当您有一个带有两个连续可选 URL 参数的路由并且您尝试使用该路由生成一个 URL 时,就会出现该错误。传入的请求匹配行为保持不变并继续正常工作。

解决方法很简单。要解决此问题,请通过删除月份和日期的默认值,将现有路由更改为没有任何可选参数。此路由现在处理指定月份和日期的第一个 URL。然后我们为其他两种情况添加一条新路由,但这条路由只有一个可选的月份参数。

就我而言,我有一条这样的路线:

routes.MapRoute(
            "HouseholdComments",
            "Comments/Household/{id}/{saQid}/{clId}",
            new { controller = "Comments", action = "Household", id = UrlParameter.Optional, saQid = UrlParameter.Optional, clId = UrlParameter.Optional }
        );

我试图像这样使用 Url.RouteUrl:

var questionHref = '@Url.RouteUrl("HouseholdComments", new {id=@Model.SafetyForm.SAS_SEQ_NO})'

认为它应该只用 1 个参数调用路由。但它没有,它返回null。就像上面 Phil 的文章一样,我必须在我的路线之后为这种情况添加一条单独的HouseholdComments路线:

routes.MapRoute(
            "HouseholdCommentsBase",
            "Comments/Household/{id}",
            new {controller = "Comments", action="Household", id=UrlParameter.Optional}
        );

然后,我能够使用该路由Url.RouteUrl正确地获取我需要的链接。

我猜你应该只需要添加另一条路由来处理你只使用Url.RouteUrl.

于 2014-01-23T22:18:44.720 回答
0

事实证明,将最新的 .NET 服务包应用到服务器,无需更改代码即可解决问题。It-Works-On-My-Machine 行为被证明是确凿的证据。

于 2014-02-10T14:42:09.940 回答