为什么模型在 Razor 页面中丢失它的绑定数据?
Why model is losing it's binded data in Razor pages?
我有两个与以下代码相关的问题
我在 OnGet 方法中绑定用户,效果很好,假设 User.Id 是 5,名称是“TestGuy”。然后在站点完全加载并调用 OnPost 方法后,User.Id 与我传递的 OnGet 参数中的产品的“id”相同,并且 User.name 为空。
为了在 OnPost 中检索该用户,我必须复制代码并再次通过 SignInManager 查询他,就像我在 OnGet 中那样,但感觉不对。
所以我的第一个问题是:为什么会这样。为什么 UserModel User 在页面加载后丢失了他的数据/?我什至尝试用 supportGet = true
装饰它
那么第二个问题。
在 OnGet 方法中,当我有这一行时:
ProductToBorrow = 产品[id - 1];
我必须从 id 中减去 1 才能匹配它们,因为 ProductToBorrow.ID 总是比产品中的 id 大 1,我不明白为什么。我查看了我的代码,没有任何代码会导致 ProductToBorrow 添加。
public class RentProductModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
public RentProductModel(SignInManager<IdentityUser> signInManager)
{
_signInManager = signInManager;
}
[BindProperty] public ProductModel ProductToBorrow { get; set; } = new();
public List<ProductModel> UserProducts { get; set; } = new();
public DateSelector dateSelector { get; set; } = new();
[BindProperty] public UserModel User { get; set; } = new();
public IEnumerable<SelectListItem> Days { get; set; }
public ApiManager apiManager { get; set; } = new();
public async Task<IActionResult> OnGetProduct(int id)
{
var currentUser = await _signInManager.UserManager.GetUserAsync(HttpContext.User);
var users = await apiManager.GetUsers();
User = users.FirstOrDefault(u => u.UserName == currentUser.UserName);
var products = await apiManager.GetProducts();
UserProducts = products.Where(x => x.Lent).Where(p => p.UserId == User.Id).ToList();
ProductToBorrow = products[id - 1];
Days = dateSelector.OptionListDays();
return Page();
}
public async Task<IActionResult> OnPostAsync()
{
var currentUser = await _signInManager.UserManager.GetUserAsync(HttpContext.User);
var users = await apiManager.GetUsers();
User = users.FirstOrDefault(u => u.UserName == currentUser.UserName);
//update product
ProductToBorrow.Lent = true;
ProductToBorrow.LoanDateTimeStart = DateTime.Now;
Convert.ToDateTime(ProductToBorrow.LoanDateTimeEnd);
ProductToBorrow.UserId = User.Id;
if (ModelState.IsValid)
{
await apiManager.UpdateProduct(ProductToBorrow);
TempData["success"] = "Product has been succesfully booked.";
}
return RedirectToPage("/Search");
}
}
我添加了以下代码,但 AllProducts 在 OnPost 处理程序中有 0 个对象 (picture)
</div>
<form method="post">
@foreach (var product in Model.AllProducts)
{
<input type="hidden" asp-for="@product.Id"/>
<input type="hidden" asp-for="@product.Type"/>
<input type="hidden" asp-for="@product.Lent" value="false"/>
<input type="hidden" asp-for="@product.LoanDateTimeStart" value="null"/>
<input type="hidden" asp-for="@product.LoanDateTimeEnd" value="null"/>
<input type="hidden" asp-for="@product.Release" value="null"/>
<input type="hidden" asp-for="@product.ReleaseId"/>
<input type="hidden" asp-for="@product.User" value="null"/>
<input type="hidden" asp-for="@product.UserId" value="null"/>
}
<div class="m-3" style="padding: 10px">
<button type="submit" class="btn btn-warning" asp-page-handler="Reset">RESET PRODUCTS</button>
</div>
</form>
</div>
尝试使用以下代码将数据传递给处理程序:
@for (var i = 0; i < Model.AllProducts.Count(); i++)
{
<input type="hidden" asp-for="@Model.AllProducts[i].Id"/>
<input type="hidden" asp-for="@Model.AllProducts[i].Type"/>
<input type="hidden" asp-for="@Model.AllProducts[i].Lent" value="false"/>
<input type="hidden" asp-for="@Model.AllProducts[i].LoanDateTimeStart" value="null"/>
<input type="hidden" asp-for="@Model.AllProducts[i].LoanDateTimeEnd" value="null"/>
<input type="hidden" asp-for="@Model.AllProducts[i].Release" value="null"/>
<input type="hidden" asp-for="@Model.AllProducts[i].ReleaseId"/>
<input type="hidden" asp-for="@Model.AllProducts[i]t.User" value="null"/>
<input type="hidden" asp-for="@Model.AllProducts[i].UserId" value="null"/>
}
我有两个与以下代码相关的问题 我在 OnGet 方法中绑定用户,效果很好,假设 User.Id 是 5,名称是“TestGuy”。然后在站点完全加载并调用 OnPost 方法后,User.Id 与我传递的 OnGet 参数中的产品的“id”相同,并且 User.name 为空。 为了在 OnPost 中检索该用户,我必须复制代码并再次通过 SignInManager 查询他,就像我在 OnGet 中那样,但感觉不对。
所以我的第一个问题是:为什么会这样。为什么 UserModel User 在页面加载后丢失了他的数据/?我什至尝试用 supportGet = true
装饰它那么第二个问题。 在 OnGet 方法中,当我有这一行时:
ProductToBorrow = 产品[id - 1];
我必须从 id 中减去 1 才能匹配它们,因为 ProductToBorrow.ID 总是比产品中的 id 大 1,我不明白为什么。我查看了我的代码,没有任何代码会导致 ProductToBorrow 添加。
public class RentProductModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
public RentProductModel(SignInManager<IdentityUser> signInManager)
{
_signInManager = signInManager;
}
[BindProperty] public ProductModel ProductToBorrow { get; set; } = new();
public List<ProductModel> UserProducts { get; set; } = new();
public DateSelector dateSelector { get; set; } = new();
[BindProperty] public UserModel User { get; set; } = new();
public IEnumerable<SelectListItem> Days { get; set; }
public ApiManager apiManager { get; set; } = new();
public async Task<IActionResult> OnGetProduct(int id)
{
var currentUser = await _signInManager.UserManager.GetUserAsync(HttpContext.User);
var users = await apiManager.GetUsers();
User = users.FirstOrDefault(u => u.UserName == currentUser.UserName);
var products = await apiManager.GetProducts();
UserProducts = products.Where(x => x.Lent).Where(p => p.UserId == User.Id).ToList();
ProductToBorrow = products[id - 1];
Days = dateSelector.OptionListDays();
return Page();
}
public async Task<IActionResult> OnPostAsync()
{
var currentUser = await _signInManager.UserManager.GetUserAsync(HttpContext.User);
var users = await apiManager.GetUsers();
User = users.FirstOrDefault(u => u.UserName == currentUser.UserName);
//update product
ProductToBorrow.Lent = true;
ProductToBorrow.LoanDateTimeStart = DateTime.Now;
Convert.ToDateTime(ProductToBorrow.LoanDateTimeEnd);
ProductToBorrow.UserId = User.Id;
if (ModelState.IsValid)
{
await apiManager.UpdateProduct(ProductToBorrow);
TempData["success"] = "Product has been succesfully booked.";
}
return RedirectToPage("/Search");
}
}
我添加了以下代码,但 AllProducts 在 OnPost 处理程序中有 0 个对象 (picture)
</div>
<form method="post">
@foreach (var product in Model.AllProducts)
{
<input type="hidden" asp-for="@product.Id"/>
<input type="hidden" asp-for="@product.Type"/>
<input type="hidden" asp-for="@product.Lent" value="false"/>
<input type="hidden" asp-for="@product.LoanDateTimeStart" value="null"/>
<input type="hidden" asp-for="@product.LoanDateTimeEnd" value="null"/>
<input type="hidden" asp-for="@product.Release" value="null"/>
<input type="hidden" asp-for="@product.ReleaseId"/>
<input type="hidden" asp-for="@product.User" value="null"/>
<input type="hidden" asp-for="@product.UserId" value="null"/>
}
<div class="m-3" style="padding: 10px">
<button type="submit" class="btn btn-warning" asp-page-handler="Reset">RESET PRODUCTS</button>
</div>
</form>
</div>
尝试使用以下代码将数据传递给处理程序:
@for (var i = 0; i < Model.AllProducts.Count(); i++)
{
<input type="hidden" asp-for="@Model.AllProducts[i].Id"/>
<input type="hidden" asp-for="@Model.AllProducts[i].Type"/>
<input type="hidden" asp-for="@Model.AllProducts[i].Lent" value="false"/>
<input type="hidden" asp-for="@Model.AllProducts[i].LoanDateTimeStart" value="null"/>
<input type="hidden" asp-for="@Model.AllProducts[i].LoanDateTimeEnd" value="null"/>
<input type="hidden" asp-for="@Model.AllProducts[i].Release" value="null"/>
<input type="hidden" asp-for="@Model.AllProducts[i].ReleaseId"/>
<input type="hidden" asp-for="@Model.AllProducts[i]t.User" value="null"/>
<input type="hidden" asp-for="@Model.AllProducts[i].UserId" value="null"/>
}