问题:
编辑:我的问题似乎实际上不是路由问题,而是锚定问题。
如果我分配了一条路线:
[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";到属性路由(见上文)