Razor 页面获得 属性 查询命名
Razor pages get property query naming
在 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>
表单输入中生成的name和id是Search
而不是q
分页中生成的url是/users?search=aaa¤tpage=2
而不是/users?q=aaa&page=1
Razor Pages 中的路由系统(用于从锚标记助手生成 URL)不喜欢 page
作为路由参数,因此您必须自己构建查询字符串,如果必须将 page
作为键:
<a href="/users?q=@Model.Search&page=@1">@i</a>
在 BindProperty
属性上传递给 name
属性 的别名仅以一种方式起作用。当您使用输入标签助手时,它们会根据应用了 BindAttribute
的 public 属性 的名称生成 name
和 id
属性。如果您想在表单字段中使用不同的值,可以通过手动设置 name
属性来覆盖它。
<input asp-for="Search" name="q" class="form-control">
在 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>
表单输入中生成的name和id是Search
而不是q
分页中生成的url是/users?search=aaa¤tpage=2
而不是/users?q=aaa&page=1
Razor Pages 中的路由系统(用于从锚标记助手生成 URL)不喜欢 page
作为路由参数,因此您必须自己构建查询字符串,如果必须将 page
作为键:
<a href="/users?q=@Model.Search&page=@1">@i</a>
在 BindProperty
属性上传递给 name
属性 的别名仅以一种方式起作用。当您使用输入标签助手时,它们会根据应用了 BindAttribute
的 public 属性 的名称生成 name
和 id
属性。如果您想在表单字段中使用不同的值,可以通过手动设置 name
属性来覆盖它。
<input asp-for="Search" name="q" class="form-control">