为什么模型在 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 中那样,但感觉不对。

  1. 所以我的第一个问题是:为什么会这样。为什么 UserModel User 在页面加载后丢失了他的数据/?我什至尝试用 supportGet = true

    装饰它
  2. 那么第二个问题。 在 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"/>
                }