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 = "...")]

我什至尝试使用这些属性的组合,例如 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>

表单输入中生成的名称和id是Search而不是q

分页中生成的url是/users?search=aaa&amp;currentpage=2而不是/users?q=aaa&amp;page=1

【问题讨论】:

该表单对您的 C# 代码一无所知,它使用 inputname 属性,即“搜索”。将其更改为“q”。 【参考方案1】:

Razor Pages 中的路由系统(用于从锚标记帮助程序生成 URL)不喜欢将 page 作为路由参数,因此如果必须,您必须自己构建查询字符串有page 作为键:

&lt;a href="/users?q=@Model.Search&amp;page=@1"&gt;@i&lt;/a&gt;

传递给BindProperty 属性上的name 属性的别名只能以一种方式工作。当您使用输入标签助手时,它们会根据已应用BindAttribute 的公共属性的名称生成nameid 属性。如果您想在表单字段中使用不同的值,可以通过手动设置 name 属性来覆盖它。

&lt;input asp-for="Search" name="q" class="form-control"&gt;

【讨论】:

由于我需要在大部分项目中使用这种系统,编写自己的 TagHelper 是不是一个坏主意? 如果不知道您在做什么的全部细节,我无法真正发表评论,但纯粹基于您问题中的场景,我看不到创建自定义标签助手的案例。

以上是关于Razor 页面获取属性查询命名的主要内容,如果未能解决你的问题,请参考以下文章

刷新视图以在Razor页面中显示更新的属性

Razor 页面:如何动态更改按钮属性(颜色、文本)以反映后端更改

具有多个实体的命名查询并获取多个属性

Asp.Net Core Mvc Razor之RazorPage

如何将 MVC 操作和属性重写为 ASP Core MVVM Razor 页面

如何通过 MVC Razor 代码获取枚举成员的显示名称属性?