ASP Razor 页面 BindProperties 值在 Post 上丢失

ASP Razor pages BindProperties values lost on Post

我正在使用 ASP Razor 项目 (.Net5)。 这是一个包含用户列表和过滤器的页面。目标是呈现符合过滤条件的用户。 下面的代码能够进行过滤,但每次过滤完成后过滤值都会丢失(变为空白)。

我有 [BindProperties] 但我不明白为什么它适用于 UserList(table 数据)而不适用于过滤条件。

我试图重新分配值,但它不起作用。有谁知道如何解决这个问题?任何指向潜在原因和文档页面的指针都将不胜感激。 我看过 https://www.learnrazorpages.com/razor-pages/tempdata,但我不确定这是要走的路。

也请不要犹豫,就代码本身提供反馈,因为它实际上是我的第一个 ASP.Net 项目。

UserList.cshtml

@model Web.Areas.Admin.Pages.UserListModel
@{
    ViewData["Title"] = "User list";
}
<h1>User list</h1>

<div>
    <form method="post">
        <label asp-for="UserNameFilter"></label>
        <input type="text" name="UserNameFilter" /> @*This input criteria reset when I click on filter*@
        <input type="submit" value="Filter" />
    </form>
</div>

<table class="table">
    <thead>
        <tr>
            <th>Id</th>
            <th>User Name</th>
            <th>Email</th>
            <th>Password</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var user in Model.UserInfos)
        {
        <tr>
            <td>@user.Id</td>
            <td>@user.UserName</td>
            <td>@user.Email</td>
            <td>
                <a asp-page="/UserUpdate" asp-route-id="@user.Id">Edit</a> |
                <a asp-page="/Details" asp-route-id="@user.Id">Details</a> |
                <a asp-page="/UserDelete" asp-route-id="@user.Id">Delete</a>
            </td>
        </tr>
        }
    </tbody>
</table>

UserList.cshtml.cs

using System.Collections.Generic;
using System.Linq;
using Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Services;

namespace Web.Areas.Admin.Pages
{
    [Authorize(Roles = "ADMIN")]
    [BindProperties]
    public class UserListModel : PageModel
    {
        public string UserNameFilter { get; set; }
        public List<UserInfo> UserInfos { get; set; }
        private readonly IUserService _userService;

        public UserListModel(IUserService userService)
        {
            _userService = userService;
        }

        public void OnGet()
        {
            UserInfos = _userService.GetUserInfoList(new UserInfoFilter()).ToList();
        }

        public void OnPost()
        {
            var userInfoFilter = new UserInfoFilter
            {
                UserName = UserNameFilter
            };
            UserInfos = _userService.GetUserInfoList(userInfoFilter).ToList();
        }
    }
}

这是一个基本答案...您需要使用模型分配输入值...

<input type="text" name="UserNameFilter" value="@Model.UserNameFilter"/> 

我要离开 post 并在这里为以后像我这样的其他菜鸟回答。 继续编码..