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