调用Url.RouteUrl无法在已部署的网站上运行

时间:2013-05-07 17:40:23

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

在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服务器上都观察到了相同的行为。其他路由调用工作正常,但看起来这是一些特殊的。

2 个答案:

答案 0 :(得分:1)

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

事实证明,连续的UrlParameter.Optional参数会导致MVC3中出现一个小错误,如this blog entry from Phil Haack所示。

  

如果您的路由包含两个连续的可选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})'

认为它只用一个参数调用路由。但它没有,它返回null。正如Phil上面的文章中所述,我必须在我的HouseholdComments路线之后为此案例添加一条单独的路线:

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

然后我可以在Url.RouteUrl中使用该路线来正确地获取我需要的链接。

我猜你应该只需要添加另一条路线来处理Url.RouteUrl中仅使用这3个参数的情况。

答案 1 :(得分:0)

事实证明,将最新的.NET服务包应用到服务器可以解决问题而无需更改代码。 It-Works-On-My-Machine的行为原来是冒烟的枪。