ASP.NET Core 2.1区域路由不起作用

时间:2018-09-30 05:03:09

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

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

enter image description here

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

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)   App.Areas.Applications.Controllers.ApplicationsController.Create(应用程序)   App.Areas.Applications.Controllers.ApplicationsController.NewRole   (应用程序)

5 个答案:

答案 0 :(得分:6)

将其放在默认路线之前...像这样

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?}");
});

答案 1 :(得分:0)

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);
        });
    }

答案 2 :(得分:0)

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

谢谢大家的帮助。

答案 3 :(得分:0)

还有另一个选项可以对代码的元数据进行一些澄清:

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

这里是一个例子:

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

它可以从.NET Core 1.0中获得

Microsoft documentation

答案 4 :(得分:0)

您可以使用简单的隔离

扩展

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;
    }
}

使用

AreaExtension

中包含 namespase _ViewImports.cshtml
<li class="nav-item"><a href="@Html.AreaUrl("Index", "Applications","Applications")" class="nav-link">Applications</a></li>
<块引用>

这个AreaExtension有3个过载