Razor Pages:将多个参数传递给同时导航 OnGetAsync
Razor Pages: passing more than one parameter to while navigation OnGetAsync
我从事代表模型 Lists
和 Records
的 Razor Page 项目:
public class List
{
public int ID { get; set; }
[StringLength(25, MinimumLength = 3, ErrorMessage = "Title should be in range between 3 and 25")]
[Display(Name = "Title")]
public string Caption { get; set; }
public string UserId { get; set; }
public User User { get; set; }
public ICollection<Record> Records { get; set; }
}
public class Record
{
public int ID { get; set; }
[StringLength(25, MinimumLength = 3, ErrorMessage = "Word should be in range between 3 and 25")]
[Display(Name = "Title")]
public string Word { get; set; }
[StringLength(30, MinimumLength = 3, ErrorMessage = "Translation should be in range between 3 and 30")]
public string Translation { get; set; }
public int ListId { get; set; }
public List List { get; set; }
}
Record 是 List 的子项。数据库中的一对多:
我在打开来自 Lists
的 Records
列表时构建了有效的 url:
现在我想为单个 Record
构建类似的 URL,如下所示:
但是,要做到这一点,我需要正确传递多个参数:ListId
和 RecordId
by csgtml
文件。像这样:
<a asp-page="./Details" asp-route-id="@item.ID,@item.ListId">Details</a>
Records/Details 中方法 OnGetAsync
的签名(我要导航的页面)应该如下所示:
public async Task<IActionResult> OnGetAsync(int? id, int? listId) {...}
Records/Details.cshtml
中的页面定义应与此类似:
@page "/Lists/{listId}/Records/{id}/Details/"
但是不行!
如果我这样定义 @page Records/Details.cshtml
:
@page "/Lists/{id}/Records/Details/"
方法
public async Task<IActionResult> OnGetAsync(int? id, int? listId)
转到断点,但是,两个参数都是空值,URL 看起来像这样:
你就快完成了,但是你需要拆分那些路由参数并使用类似这样的东西:
<a asp-page="./Details" asp-route-id="@item.ID" asp-route-listId="@item.ListId">Details</a>
您使用 asp-route-*
设置您的参数,其中 * 代表参数本身的名称并用于每个单独的参数。
如果需要指定多个路由值,可以在锚标签助手上使用asp-all-route-data
属性:
@{
var routeValues = new Dictionary<string, string>
{
{ "listId", item.ListId },
{ "id", item.ID }
};
}
<a asp-page="./Details" asp-all-route-data="routeValues">Click</a>
我从事代表模型 Lists
和 Records
的 Razor Page 项目:
public class List
{
public int ID { get; set; }
[StringLength(25, MinimumLength = 3, ErrorMessage = "Title should be in range between 3 and 25")]
[Display(Name = "Title")]
public string Caption { get; set; }
public string UserId { get; set; }
public User User { get; set; }
public ICollection<Record> Records { get; set; }
}
public class Record
{
public int ID { get; set; }
[StringLength(25, MinimumLength = 3, ErrorMessage = "Word should be in range between 3 and 25")]
[Display(Name = "Title")]
public string Word { get; set; }
[StringLength(30, MinimumLength = 3, ErrorMessage = "Translation should be in range between 3 and 30")]
public string Translation { get; set; }
public int ListId { get; set; }
public List List { get; set; }
}
Record 是 List 的子项。数据库中的一对多:
我在打开来自 Lists
的 Records
列表时构建了有效的 url:
现在我想为单个 Record
构建类似的 URL,如下所示:
ListId
和 RecordId
by csgtml
文件。像这样:
<a asp-page="./Details" asp-route-id="@item.ID,@item.ListId">Details</a>
Records/Details 中方法 OnGetAsync
的签名(我要导航的页面)应该如下所示:
public async Task<IActionResult> OnGetAsync(int? id, int? listId) {...}
Records/Details.cshtml
中的页面定义应与此类似:
@page "/Lists/{listId}/Records/{id}/Details/"
但是不行!
如果我这样定义 @page Records/Details.cshtml
:
@page "/Lists/{id}/Records/Details/"
方法
public async Task<IActionResult> OnGetAsync(int? id, int? listId)
转到断点,但是,两个参数都是空值,URL 看起来像这样:
你就快完成了,但是你需要拆分那些路由参数并使用类似这样的东西:
<a asp-page="./Details" asp-route-id="@item.ID" asp-route-listId="@item.ListId">Details</a>
您使用 asp-route-*
设置您的参数,其中 * 代表参数本身的名称并用于每个单独的参数。
如果需要指定多个路由值,可以在锚标签助手上使用asp-all-route-data
属性:
@{
var routeValues = new Dictionary<string, string>
{
{ "listId", item.ListId },
{ "id", item.ID }
};
}
<a asp-page="./Details" asp-all-route-data="routeValues">Click</a>