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 并在这里为以后像我这样的其他菜鸟回答。
继续编码..
我正在使用 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 并在这里为以后像我这样的其他菜鸟回答。 继续编码..