Asp.net mvc 3 调用Url.RouteUrl无法在已部署的网站上工作

Asp.net mvc 3 调用Url.RouteUrl无法在已部署的网站上工作,asp.net-mvc-3,asp.net-mvc-routing,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></

在ASP MVC3项目中,调用:-

<h2><a href="@Url.RouteUrl("_ScientificPrograms", new { idProgramaSeleccionado = @programa.Id, nombrePrograma = @programa.NombreProgramaUrl(), IdiomaSeleccion = idioma })">@programa.NombrePrograma(@idioma)</a></h2>
在我的本地机器上运行,可以生成URL,如:-

http://localhost/es/research/scientific-programmes/1/molecular-oncology
但是,当部署网站时,只会产生相同的调用

http://deployedsite/es/research/
虽然进入

http://deployedsite/es/research/scientific-programmes/1/molecular-oncology
是否正确解析该页


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

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

结果表明,连续的
urlparmeter.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 }
        );
var questionHref = '@Url.RouteUrl("HouseholdComments", new {id=@Model.SafetyForm.SAS_SEQ_NO})'
我试着像这样使用Url.RouteUrl:

routes.MapRoute(
            "HouseholdComments",
            "Comments/Household/{id}/{saQid}/{clId}",
            new { controller = "Comments", action = "Household", id = UrlParameter.Optional, saQid = UrlParameter.Optional, clId = UrlParameter.Optional }
        );
var questionHref = '@Url.RouteUrl("HouseholdComments", new {id=@Model.SafetyForm.SAS_SEQ_NO})'
认为它应该只使用1个参数调用route。但它没有,它返回null。正如上面Phil的文章中所述,我必须在我的
HouseholdComments
路线之后为这个案例添加一条单独的路线:

routes.MapRoute(
            "HouseholdCommentsBase",
            "Comments/Household/{id}",
            new {controller = "Comments", action="Household", id=UrlParameter.Optional}
        );
然后,我可以在
Url.RouteUrl
中使用该路由来正确地获取所需的链接


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

中的这3个参数的情况。事实证明,将最新的.NET service Pack应用到服务器解决了这个问题,代码没有更改。在我的机器上起作用的是冒烟的枪