Razor 页面获得 属性 查询命名

Razor pages get property query naming

在 Razor 页面中,我想获得有关如何生成查询参数的特定行为,例如,我想获得这种 url:

https://localhost:5001/admin/users?q=1&page=5

在我的页面模型中,我有两个属性绑定到 OnGetAsync 方法。 我尝试使用

给属性自定义命名

我什至尝试使用这些属性的组合,例如 BindPropertyFromQuery。 我注意到,当使用 [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&currentpage=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 属性 的名称生成 nameid 属性。如果您想在表单字段中使用不同的值,可以通过手动设置 name 属性来覆盖它。

<input asp-for="Search" name="q" class="form-control">