【问题标题】:ASP.NET Core 2.1 Areas routing not workingASP.NET Core 2.1 区域路由不起作用
【发布时间】:2019-03-05 14:25:29
【问题描述】:

我的新区域有这个文件夹结构

这是我在启动时的设置方式:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");

    routes.MapRoute(
      name: "areas",
      template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    );
});

这就是我创建基本控制器的方式

namespace App.Areas.Applications.Controllers
{
    [Area("Applications")]
    [Authorize]
    public abstract class ApplicationsBaseController : Controller
    {

    }
}

然后我的 ApplicationsController 继承了 BaseController

但是,当我设置这样的链接时

<li class="nav-item"><a asp-area="Applications" asp-controller="Applications" asp-action="Index" class="nav-link">Applications</a></li>

这是在我的网址https://localhost:44338/Applications?area=Applications 中显示的链接,我得到一个页面找不到。

设置我的区域时我错过了什么?

编辑:

当我在 [Area("Applications")] 之后添加 [Route("Applications/[controller]")] 时,出现此错误

处理请求时发生未处理的异常。 AmbiguousActionException:匹配多个操作。下列 动作匹配路由数据并满足所有约束:

App.Areas.Applications.Controllers.ApplicationsController.Index(应用程序) App.Areas.Applications.Controllers.ApplicationsController.Create(应用程序) App.Areas.Applications.Controllers.ApplicationsController.NewRole (应用)

【问题讨论】:

标签: c# asp.net asp.net-core .net-core


【解决方案1】:

把它放在默认路由之前……像这样

app.UseMvc(routes =>
{
 routes.MapRoute(
  name: "areas",
  template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);

routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
});

【讨论】:

  • 这是一个晦涩难懂的信息。这值得更多的投票。
【解决方案2】:

IMO,您应该为特定视图创建 Controller 文件夹。否则,当Applications 区域有多个控制器时会失败。

无论如何,要返回 Views Folder 中的视图,请尝试配置 AreaViewLocationFormats 以指定视图搜索位置。

        public void ConfigureServices(IServiceCollection services)
    {
        //rest services
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddSessionStateTempDataProvider();
        services.Configure<RazorViewEngineOptions>(o =>
        {
            o.AreaViewLocationFormats.Add("/Areas/{2}/{0}" + RazorViewEngine.ViewExtension);
        });
    }

【讨论】:

    【解决方案3】:

    我意识到问题所在。在每个控制器中,我需要先在顶部声明 [Area="AreaName"] 以使路由正常工作。

    感谢大家的帮助。

    【讨论】:

      【解决方案4】:

      还有另一个选项确实在代码的元数据方面带来了一些澄清:

      在中使用 MapAreaRoute 扩展方法 命名空间:Microsoft.AspNetCore.Builder

      这是一个例子:

                routes.MapAreaRoute(
                      name: "AdminArea",
                      areaName: "Admin",
                      template: Admin/{controller=Home}/{action=Index}/{id?}");
      

      可从 .NET Core 1.0 获得

      Microsoft documentation

      【讨论】:

        【解决方案5】:

        你可以使用简单的解法

        扩展

        public static class AreaExtension
        {
            public static string AreaUrl(this IHtmlHelper helper, string action,  params string[] parameters)
            {
                var viewContext = helper.ViewContext.RouteData.Values;
        
                string controller = (string)viewContext["controller"],
                 area = (string)viewContext["area"];
                return GenerateUrl(action, controller, area, parameters);
            }
        
            public static string AreaUrl(this IHtmlHelper helper, string action, string controller, params string[] parameters)
            {
                var viewContext = helper.ViewContext.RouteData.Values;
        
                string area = (string)viewContext["area"];
                return GenerateUrl(action, controller, area, parameters);
            }
        
            public static string AreaUrl(this IHtmlHelper helper, string action, string controller, string area, params string[] parameters)
                => GenerateUrl(action, controller, area, parameters);
        
            private static string GenerateUrl(string action, string controller, string area, params string[] parameters)
            {
                if (action == null)
                    throw new ArgumentNullException(nameof(controller));
                if (controller == null)
                    throw new ArgumentNullException(nameof(action));
        
                string urlParams = string.Empty;
        
                if (parameters != null && parameters.Length > 0)
                    urlParams = "?" + string.Join("&", parameters);
        
                return "/" + string.Join("/", area, controller, action) + urlParams;
            }
        }
        

        用法

        _ViewImports.cshtml 中包含namespase AreaExtension

        <li class="nav-item"><a href="@Html.AreaUrl("Index", "Applications","Applications")" class="nav-link">Applications</a></li>
        

        此区域扩展有 3 个重载

        【讨论】:

          猜你喜欢
          • 2018-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-04
          相关资源
          最近更新 更多