ASP MVC从区域视图链接到非区域视图
本文关键字:视图 区域 链接 MVC ASP | 更新日期: 2023-09-27 18:24:53
我遇到了从区域视图到非区域视图的反向链接问题。
当前结构
Web应用程序树:
- /控制器/BaseController.cs
- /视图/Base/Index.cshtml
- /区域/区域1/控制器/设置Controller.cs
- /区域/区域1/视图/设置/索引。cshtml
默认路由配置:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "Localization",
url: "{culture}/{controller}/{action}/{id}",
defaults: new { culture = "de-DE", area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
区域路由配置:
public class Area1AreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Area1";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Photovoltaics_localized",
"{culture}/Photovoltaics/{controller}/{action}/{id}",
new { culture = "de-DE", action = "Index", id = UrlParameter.Optional }
);
context.MapRoute(
"Area1_default",
"Area1/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
注册路由配置(Global.asax.cs)
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
[..]
问题
当我在基本视图(/Views/base/Index.cshtml)中时,代码@Html.ActionLink("My home link", "Index", "Home")
会生成我期望的链接http://localhost:81/de-DE/主页。
当我在区域视图(/Areas/Area1/Views/Setting/Index.cshtml)中时,相同的代码会生成一个链接http://localhost:81/de-DE/Area1/主场,但这毫无意义。
目前已尝试
我了解到代码@Html.ActionLink("My home link", "Index", "Home", new { area = ""}, null)
既适用于区域视图,也适用于非区域视图,并导致正确的http://localhost:81/de-DE/主视图。
问题
如何构造路由配置,使调用不带区域作为参数的链接创建方法始终链接到基本视图/控制器?
或者有更好的解决方案来实现这一点吗?
我期望的是:
@Html.ActionLink("My home link", *action*, "controller")
=http://localhost:81/de-DE/动作
@Html.ActionLink("My home link", *action*, *controller*, new { area = *area*}, null)
=http://localhost:81/de-DE/区域/action
这与路由无关。这是ActionLink方法URL创建的默认行为。您可以在以下代码(取自ASP.NET MVC代码集)中看到这一点:
if (values != null)
{
object targetAreaRawValue;
if (values.TryGetValue("area", out targetAreaRawValue))
{
targetArea = targetAreaRawValue as string;
}
else
{
// set target area to current area
if (requestContext != null)
{
targetArea = AreaHelpers.GetAreaName(requestContext.RouteData);
}
}
}
正如您所看到的,如果您不传递区域值,它将占用您所在的当前区域。
我能想到的唯一解决方案是创建自己的HTML扩展。类似的东西:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName)
{
return htmlHelper.ActionLink(linkText, actionName, controllerName, new { area = String.Empty });
}