У меня есть страница Razor в ASP. NET ядре, предназначенном для редактирования данных о продукте. Он получает идентификатор продукта и имеет элементы управления вводом для редактирования свойств указанного продукта. Он имеет привязку к экземпляру продукта, сохраненному в PageModel. Я заполняю экземпляр продукта OnGet, который отлично работает, так как он правильно заполняет поля. Когда я отправляю форму и вызывается OnPost, я вижу, что экземпляр продукта теперь пуст.
После отладки я понял, что при отправке формы PageModel повторно создается (конструктор вызывается снова), поэтому экземпляр продукта сбрасывается и теперь имеет значение null.
Это ожидаемое поведение?
Если эта привязка между свойством в моей PageModel и его представлением на странице Razor не сохраняется?
В курсе, который я придерживаюсь, это ведет себя по-другому, Экземпляр продукта сохраняется для вызова метода OnPost. Модель моей страницы:
public class EditModel : PageModel
{
private readonly IProductData productData;
private readonly IHtmlHelper htmlHelper;
[BindProperty]
public Product Product { get; set; }
public IEnumerable<SelectListItem> Category { get; set; }
public EditModel(IProductData productData, IHtmlHelper htmlHelper)
{
this.productData = productData;
this.htmlHelper = htmlHelper;
}
public IActionResult OnGet(int productId)
{
Category = htmlHelper.GetEnumSelectList<ProductType>();
Product = productData.GetById(productId);
if(Product == null)
{
return RedirectToPage("./NotFound");
}
return Page();
}
public IActionResult OnPost()
{
Product = productData.Update(Product);
productData.Commit();
return Page();
}
}
Страница моей бритвы:
@page "{productId:int}"
@model LearningASPdotNETCore.Pages.Products.EditModel
@{
ViewData["Title"] = "Edit";
}
<h1>Editing @Model.Product.Name</h1>
<form method="post">
<input type="hidden" asp-for="Product.Id" />
<div class="form-group">
<label asp-for="Product.Name"></label>
<input asp-for="Product.Name" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Product.Country"></label>
<input asp-for="Product.Country" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Product.Type"></label>
<select class="form-control" asp-for="Product.Type" asp-items="Model.Category">
</select>
</div>
<button type="submit" class="btn btn-primary">Save</button>