不同的URL指向同一个控制器ASP MVC Core

时间:2018-06-05 03:38:25

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

我需要生成一个具有“系统”功能的导航系统。和'类别' archons或buttons。系统和类别使用相同的控制器。我想使用[Route()]代替Startup文件进行路由。

对于类别执政官工作很棒:

<a asp-area="Admin" asp-controller="@value.Controller" asp-action="@Constants.Route.List" asp-route-valueId="@value.ValueId">@value.Value</a>

但我不知道如何使用相同的控制器来管理/系统/列表&#39;而不是admin / categorytype / list,到目前为止我尝试过:

1)

<a asp-area="Admin" asp-route="System" asp-action="@Constants.Route.List" asp-route-valueId="@value.ValueId">@value.Value</a>

2)

<a asp-route="Admin/System/List" asp-route-valueId="@value.ValueId">@value.Value</a>

并在控制器

[Area("Admin")]
[Route("Admin/[controller]")]
[Route("Admin/System")]
[Authorize]
public class CategoryTypeController : Controller {}
    [Route("[action]")]
    public ViewResult List(int valueId) {}

第3)

<a href="@Url.RouteUrl("SystemValue", new { valueId = value.ValueId })">@value.Value</a>

并在控制器

[Area("Admin")]
[Route("Admin/[controller]")]
[Route("Admin/System", Name = "SystemValue")]
[Authorize]
public class CategoryTypeController : Controller {}
    [Route("[action]")]
    public ViewResult List(int valueId) {}

以上路由都没有生成url,允许我通过/ admin / system / list

转到CategoryType控制器和List操作

我在app.UseMvcWithDefaultRoute();档案中也有Startup

修改 当我手动输入地址/admin/system/list时 - 路由器工作, 但我无法为按钮或执政官生成这样的网址以匹配/admin/system/list

如附图所示,执政官没有任何网址 screenshot of the browser

修改 我找到了一个解决方案,但我对此并不满意,事实证明我不了解路由的工作原理。对我来说,[Route ()]属性是定义路径的一种方式,app.UseMvc()是第二种方式。我必须在两个地方定义路线。

Startup.cs

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "SystemValue",
            template: "Admin/System/List/{id?}",
            defaults: new { area = "Admin", controller = "CategoryType", action = "List" });
    });

控制器

[Area("Admin")]
[Route("Admin/[controller]")]
[Route("Admin/System", Name = "SystemValue")]
[Authorize]
public class CategoryTypeController : Controller
{}
    [Route("[action]")]
    public ViewResult List(int valueId) {}

查看

<a href="@Url.RouteUrl("SystemValue", new { valueId = value.ValueId})">@value.Value</a>

我仍然会寻找一个解决方案,如何只使用[Route ("")]

1 个答案:

答案 0 :(得分:1)

如果要单独指定路由,可以使用命名路由,但需要在方法上指定,而不是在控制器上指定。

[Route("/admin/system/list/{id}",name ="SystemList")]
[Route("/admin/category/list/{id}",name ="CategoryList")]
public IActionResult List(int id)
{
...
}

您可以为此路线生成

的网址
<a asp-route="CategoryList" asp-route-id="@value.ValueId">@value.Value</a>

路由系统可以使用在启动时声明的路由或使用由属性声明的路由,但它们不会混合,当您在控制器级别指定路由属性时,将忽略启动路由。