AspNetMvc 在两个不同的路由之间导航时附加 url

AspNetMvc appends url when navigating between two different routes

我的 mvc 站点中有一个名为 adpan 的区域,具有以下路由配置:

context.MapRoute(
     "adpan_clinics",
     "adpan/DoctorClinics/{doctorObj}/{controller}/{action}/{clinicObj}",
     new { action = "Index", Controller = "Clinics", clinicObj = UrlParameter.Optional }
     );

context.MapRoute(
    "adpan_default",
    "adpan/{controller}/{action}/{obj}",
    new { action = "Index", Controller = "Dashboard", obj = UrlParameter.Optional }
    );

我使用 T4MVC 进行路由。一切正常,直到我想使用操作 link 从 adpan_clinics 返回到 adpan_default

场景) 我有以下 urls:

第 1 url) http://localhost/adpan/Doctors/Index

第二url)http://localhost/adpan/DoctorClinics/doctor1/Clinics/index

我可以重定向到 2nd url link on 1st url's[=58] =] 像这样查看:

 @Html.ActionLink("Manage Clinics", MVC.adpan.Clinics.Index().AddRouteValues(new { doctorObj = item.Url }))

但是,当使用以下操作 link 重定向回 1st url 时,我面临 url 附加问题:

 @Html.ActionLink("Back to Doctors", MVC.adpan.Doctors.Index())

此操作 link 给了我以下 错误 url 而不是 1st url (虽然页面加载正确!):

不好 url) http://localhost/adpan/DoctorClinics/doctor1/Doctors

注意: 我也尝试过不使用 T4MVC 并在操作 link 参数中指定空值,如下所示,但仍然得到 错误url:

@Html.ActionLink("Back to Doctors", "Index", "Doctors", null, null)

我只是在 adpan 地区工作,有 2 条路线。

我将不胜感激任何解决方案,如果可能的话,从 错误 url.

中获得正确视图的原因

路线值不仅由 ActionLink 的参数提供,而且 bleed over from the current request. While many people don't find this intuitive, it makes it really easy to do things like 或网站区域。

元数据的路由值不是。它们是匹配 URL 模式或确定使用哪条路由构建传出 URL 时将使用的值。我怀疑这就是你正在努力解决的问题,因为将路由值设置为 URL.

是非常不寻常的

如果您需要将元数据与路由信息一起传递,可以使用 DataTokens 属性 来达到此目的。虽然两者都通过请求传递,但仅使用路由值来确定路由是否匹配。

也可以通过显式指定来覆盖当前请求的路由值。

@Html.RouteLink("foobar", new { controller = "Home", action = "Index", doctorObj = "" })

但由于您需要对每个受影响的 link 执行此操作,因此将 invalid 数据保留在第一个路由值之外更为实用地点。

基于@NightOwl888 and difference between RouteLink and ActionLink,我找到了硬编码方法和 T4MVC 方法的解决方案。

1) 硬编码方法:必须指定路由名称:

//signiture: RouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, object routeValues);
@Html.RouteLink("Back to Doctors","adpan_default", new { controller = "Doctors", action = "Index"})

结果 url:http://localhost/adpan/Doctors

2)T4MVC方​​法:必须指定路由名称:

//signiture: RouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, ActionResult result, IDictionary<string, object> htmlAttributes)
@Html.RouteLink("Back to Doctors","adpan_default", MVC.adpan.Doctors.Index().AddRouteValues(new {Area=""}), null)

结果 url:http://localhost/adpan/Doctors

为什么 AddRouteValues(new {Area=""}) ?

由于讨论 here,这似乎是 T4MVC 中的错误。在路由 link 下面将 ?Area=adpan 作为无用参数添加到 url:

@Html.RouteLink("Back to Doctors", "adpan_default", MVC.adpan.Doctors.Index(), null)

结果 url:http://localhost/adpan/Doctors?Area=adpan

但是,这可能是一种欺骗 T4MVC 中不需要的 url 参数的技巧。