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

ASP MVC从区域视图链接到非区域视图

这与路由无关。这是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 });
}