【问题标题】:Call to Url.RouteUrl not working on deployed website调用 Url.RouteUrl 在已部署的网站上不起作用
【发布时间】:2014-02-10 22:43:45
【问题描述】:

在 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 服务器上都观察到了相同的行为。其他路由调用工作正常,但似乎这个有点特别。

【问题讨论】:

    标签: asp.net-mvc-3 asp.net-mvc-routing


    【解决方案1】:

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

    事实证明,按照this blog entry from 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中只使用这3个参数的情况。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-06-05
        • 2020-10-30
        • 2010-10-22
        • 2010-10-16
        • 1970-01-01
        • 2011-05-11
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多