我的新区域具有这种文件夹结构
这是我在启动时进行设置的方式:
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 (应用程序)
答案 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中获得
答案 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
_ViewImports.cshtml
<li class="nav-item"><a href="@Html.AreaUrl("Index", "Applications","Applications")" class="nav-link">Applications</a></li>
<块引用>
这个AreaExtension有3个过载