Почему HTML отправляет форму для повторного создания PageModel в ASP. NET Core? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть страница 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>

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Я нашел решение. Кажется, что экземпляр продукта не может быть создан, потому что я не реализовал свойство get / set. Это смущает меня, так как я думал, что эти два были равны, но я думаю, нет. До (не работал):

public class Product
{
    public int Id;
    public string Name;
    public string Country;
    public ProductType Type;
}

После (работает):

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public ProductType Type { get; set; }
}
0 голосов
/ 13 апреля 2020

Да, это ожидаемое поведение. Практически все в конвейере запросов, включая PageModel, контроллеры и т. Д. c. находятся в области запроса. Они создаются в начале запроса и удаляются по завершении запроса. Если вам нужно что-то установить, то это должно быть установлено для каждого запроса , независимо от метода (GET, POST и т. Д. c.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...