【问题标题】:Different URL's to the same controller ASP MVC Core到同一个控制器 ASP MVC Core 的不同 URL
【发布时间】:2018-06-06 19:44:23
【问题描述】:

我需要生成一个包含“系统”和“类别”执政官或按钮的导航。 System 和 Category 使用相同的控制器。我想使用[Route()] 而不是Startup 文件进行路由。

对于执政官类别效果很好:

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

但我不知道如何将相同的控制器用于“admin/system/list”而不是 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) {}

以上路由均未生成允许我通过 /admin/system/list 转到 CategoryType 控制器和 List 操作的 url

我在Startup 文件中也有app.UseMvcWithDefaultRoute();

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

如附图所示,执政官没有任何网址

编辑: 我找到了一个解决方案,但我对此并不满意,结果我不明白路由是如何工作的。对我来说,[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 ("")]

【问题讨论】:

  • [Area("Admin")] [Route("Admin/[controller]")] [Route("System", Name = "SystemValue")] [Authorize] public class CategoryTypeController : Controller {} [Route("List")] public ViewResult List(int valueId) {} 工作吗?
  • 当我手动输入地址/管理员/系统/列表-路由器工作,但我无法为按钮或执政官生成这样的网址,我编辑了主帖子。 [Route ("List")] 到与 [Route ("[action]")] 相同的事物]
  • but I can not generate such a url for button 它生成了什么 url
  • 我附上了一张图片 - 没有
  • 屏幕截图中的视图。它是内部还是外部Admin区域?

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


【解决方案1】:

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

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

你可以为这条路线生成 url

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

路由系统可以使用启动时声明的路由,也可以使用属性声明的路由,但不能混合使用,当你在控制器级别指定路由属性时,启动时的路由会被忽略。

【讨论】:

  • 谢谢!,我浏览了很多关于 Route 属性的教程,但没有一个包含这个重要的细节。
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 2019-08-15
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 2021-09-05
相关资源
最近更新 更多