Razor 页面获取属性查询命名
Posted
技术标签:
【中文标题】Razor 页面获取属性查询命名【英文标题】:Razor pages get property query naming 【发布时间】:2022-01-06 06:03:12 【问题描述】:在 Razor 页面中,我想获得有关如何生成查询参数的特定行为,例如,我想获得这种 url:
https://localhost:5001/admin/users?q=1&page=5
在我的页面模型中,我有两个属性绑定到 OnGetAsync
方法。
我尝试给属性自定义命名
[Display(Name = "...")]
[FromQuery(Name = "...")]
[ModelBinding(Name = "...")]
[BindProperty(Name = "...")]
我什至尝试使用这些属性的组合,例如 BindProperty
和 FromQuery
。
我注意到的是,当使用[FromQuery]
时,如果我在浏览器中手动编写 url,则属性会获得正确的名称,但在为表单或 url 生成它时,我无法使用正确的名称获得它。
这是我的页面:
public class Users : PageModel
private readonly UserManager<IdentityUser> _userManager;
public Users(UserManager<IdentityUser> userManager)
_userManager = userManager;
[FromQuery(Name = "q")]
[BindProperty(Name = "q", SupportsGet = true)]
public string Search get; set;
public IdentityUser CurrentUser get; set;
[FromQuery(Name = "page")]
[BindProperty(Name = "page", SupportsGet = true)]
public int CurrentPage get; set; = 1;
public ICollection<IdentityUser> Users get; set;
public async Task OnGetAsync()
CurrentUser = await _userManager.GetUserAsync(HttpContext.User);
IList<IdentityUser> users;
if (string.IsNullOrWhiteSpace(Search))
users = await _userManager.Users
.OrderBy(x => x.UserName)
.ThenBy(x => x.Email)
.ToListAsync();
else
users = await _userManager.Users.Where(
x => x.Username.Contains(Search)
|| x.Email.Contains(Search)
)
.OrderBy(x => x.UserName)
.ThenBy(x => x.Email)
.ToListAsync();
这是相关的html:
@page
@model Pages.Users
<form method="get" class="mt-5 mb-2">
<div class="form-row">
<div class="form-group col">
<label class="sr-only" asp-for="Search"></label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<i class="fa fa-search"></i>
</div>
</div>
<input asp-for="Search" class="form-control">
</div>
</div>
</div>
</form>
<ul class="pagination">
@for (var i = 1; i < Model.TotalPages; i++)
<li class="page-item @(Model.CurrentPage == i ? "active" : "")">
<a asp-page="/Users" asp-route-search="@Model.Search" asp-route-currentpage="@i" class="page-link">@i</a>
</li>
</ul>
表单输入中生成的名称和id是Search
而不是q
分页中生成的url是/users?search=aaa&currentpage=2
而不是/users?q=aaa&page=1
【问题讨论】:
该表单对您的 C# 代码一无所知,它使用input
的 name
属性,即“搜索”。将其更改为“q”。
【参考方案1】:
Razor Pages 中的路由系统(用于从锚标记帮助程序生成 URL)不喜欢将 page
作为路由参数,因此如果必须,您必须自己构建查询字符串有page
作为键:
<a href="/users?q=@Model.Search&page=@1">@i</a>
传递给BindProperty
属性上的name
属性的别名只能以一种方式工作。当您使用输入标签助手时,它们会根据已应用BindAttribute
的公共属性的名称生成name
和id
属性。如果您想在表单字段中使用不同的值,可以通过手动设置 name
属性来覆盖它。
<input asp-for="Search" name="q" class="form-control">
【讨论】:
由于我需要在大部分项目中使用这种系统,编写自己的 TagHelper 是不是一个坏主意? 如果不知道您在做什么的全部细节,我无法真正发表评论,但纯粹基于您问题中的场景,我看不到创建自定义标签助手的案例。以上是关于Razor 页面获取属性查询命名的主要内容,如果未能解决你的问题,请参考以下文章
Razor 页面:如何动态更改按钮属性(颜色、文本)以反映后端更改
Asp.Net Core Mvc Razor之RazorPage