C#核心MVC如何将自定义URL应用于控制器操作



问题:

编辑:我的问题似乎实际上不是路由问题,而是锚定问题。

如果我分配了一条路线:

[Route("~/Envelope/List/AcademicYear/{year}")] 
public IActionResult AcademicYear(string year)
{
}

如何正确使用asp操作来调用此路由?使用

<a asp-action="List/AcademicYear/" asp-route-id="@Model.AcademicYear">@Model.AcademicYear</a>

返回一个带有%2f(信封/列表%2fAcademicYear/2122)而不是/(信封/名单/学院年/2122)的url,从而导致404错误

如何使用自定义URL和asp操作来调用控制器中的特定操作?

如何更改路由,以便从具有非默认路由映射的控制器调用操作?

上下文:

我读过https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-5.0然而,我仍然对路由的整个概念以及如何与控制器和操作交互感到困惑。

在我的应用程序中,我有一个名为Envelope的控制器,它控制与我的Envelopes有关的一切。

我在Envelopes控制器中有一个类,叫做

public class EnvelopeController : Controller {
public IActionResult List() {... return View()}

并返回List.cshtml视图。默认路由映射设置的当前url:Envelope/List

在List.cshtml中,我有一个链接,用于过滤年份参数上的列表

<a asp-action="AcademicYear" asp-route-academicYear="@Model.AcademicYear"> @Model.AcademicYear</a>

我的意图是将其传递到Envelopes控制器中的一个名为"的方法中;"学年";它收集存储在临时数据中的信封数据,对其进行去极化,然后返回基于参数的过滤版本:

public IActionResult AcademicYear(string academicYear) { return View("List", newViewModel)}

这一点之后的返回url正确:/Envelope/Academy Year?academicYear=21%2F22

然而,我想知道如何改变这一点,即使我称之为行动

<a asp-action="AcademicYear" asp-route-academicYear="@Model.AcademicYear"/>

返回的URL如下所示

有办法做到这一点吗?我是不是看错了这个问题?我曾考虑过在List操作中简单地传递一个参数,并根据参数的存在运行某种形式的控制来执行任何一组操作,但实际上List方法和过滤Academy方法并没有真正做同样的事情,如果可能的话,我想将代码分为不同的方法。

即使这不是合适的解决方案,我仍然想知道是否可以在调用操作后更改该操作的URL路由。

编辑:我已经尝试过使用HttpGet(List/ArchicYear/{AcademicYear:[a-zA-Z]}),但当我这样做时,由于"/"以及它如何编码到%2f ,我实际上无法将List/ArchicalYear调用为asp操作

答案

在以下解决方案的帮助下,我意识到我看错了问题,实际上在创建正确的锚时遇到了问题。

阅读:https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-5.0#url生成和环境值-1

我意识到答案就在眼前,我把它和答案中提供的路线一起使用

<a id="@academicYear.Name" href="@Url.Action("AcademicYear", "Envelope",new {year= academicYear.Name})">

也许你只需要像这样装饰你的动作:

[HttpGet("List/AcademicYear/{year:int}")] // or HttpPost it depends on you
public IActionResult AcademicYear(string year) { }

您可以向操作添加多个属性路由。

[Route("~/Envelope/List/AcademicYear/{year}", Name="ListRoute")]
[Route("~/Envelope/AcademicYear/{year}")] 
public IActionResult AcademicYear(string year) { }

如果你需要这个网址

http://localhost:xxxx/Envelope/List/AcademicYear/2021

您可以使用这个html助手,它将使用属性路由名称为您创建一个右锚标记。

@Html.RouteLink(@Model.AcademicYear, "ListRoute", new { year = @Model.AcademicYear })

我添加了Name=";ListRoute";到属性路由(见上文)

相关内容

  • 没有找到相关文章

最新更新