Problem z przekazaniem argumentów

1

Hej uczę się ASP. Net i w kursie jestem na etapie stworzenia na stronie formularza i przekazania wartości z inputów do handlera OnPost() i nie mogę zrozumieć jednej sytuacji.
Mam podstronę, której zadaniem jest tworzenie nowej kategorii ( np. dla produktów ) i zapis tej kategorii do bazy danych za pomocą Entity.

Tak wygląda plik .cs tej podstrony:

using AbbyWeb.Data;
using AbbyWeb.Model;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace AbbyWeb.Pages.Categories
{
    public class CreateModel : PageModel
    {
        private readonly ApplicationDbContext _db;
        public Category Category { get;set;}

        public CreateModel(ApplicationDbContext db)
        {
            _db = db;
        }

        public void OnGet()
        {
        }
        public async Task<IActionResult> OnPost(Category category)
        {
            await _db.Categories.AddAsync(category);
            await _db.SaveChangesAsync();
            return RedirectToPage("Index");

        }
    }
}

A tak wygląda prosty formularz napisany w widoku tej strony:

@page
@model AbbyWeb.Pages.Categories.CreateModel
@{
    <form method="post">
        <div class="border p-3 mt-4">
            <div class="row pb-2">
                <h2 class="text-primary pl-3">Create category</h2>
                <hr/>
            </div>
            <div class="mb-3">
                <label asp-for="Category.Name"></label>
               <input asp-for="Category.Name" type="text" class="form-control">
            </div>
            <div class="mb-3">
                <label asp-for="Category.DisplayOrder"></label>
                    <input asp-for="Category.DisplayOrder" type="text" class="form-control">
            </div>
            <button type="submit" class="btn btn-primary" style="width:150px">Create button</button>
        </div>
    </form>
}

I mam problem, ponieważ w metodzie:

public async Task<IActionResult> OnPost(Category category)
        {
            await _db.Categories.AddAsync(category);
            await _db.SaveChangesAsync();
            return RedirectToPage("Index");

        }

nazwa argumentu (category) musi być dokładnie taka sama jak nazwa właściwości:

  public Category Category { get;set;}

W przeciwnym wypadku w miejscu:

  await _db.Categories.AddAsync(category);

w argumencie category wszystkie pola przechowują wartości null...

Wygląda na to, że jak nazwa przyjmowanego argumentu do handlera będzie inna niż nazwa właściwości wykorzystywana w widoku to dane z inputa do niego nie trafiają.
Czy ktoś wie o co może chodzić ? Czy ASP wymaga konkretnego nazewnictwa dla parametrów w handlerze ?

2

Tworzysz sobie model tabeli w bazie danych:

    public class Category
    {
        public Guid Id { get; set; }
        public string Title { get; set; }
        public string Name { get; set; }
    }

Następnie dodajesz go do kontekstu ApplicationDbContext.
Kolejnym krokiem jest stworzenie modelu akcji Post kontrolera

    public class CreateModel
    {
        [Required]
        public string Title { get; set; }
        [Required]
        public string Name { get; set; }
    }

W kontrolerze dodajesz właściwość:

[BindProperty]
public CreateModel Input { get; set; }

A akcja wygląda tak:

public async Task<IActionResult> OnPostAsync()
{
    if (ModelState.IsValid)
    {
      Category category = new Category(){
        Id = Guid.NewGuid(),
        Title = Input.Title,
        Name = Input.Name
      }
      await _dbContext.Categories.AddAsync(category);
      await _dbContext.SaveChangesAsync();
      TempData["NewId"] = category.Id.ToString();
      return RedirectToActionPermanent("Index", "Home");
    }
    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
    return Page();
}

W widoku modelem będzie nasz typ z nazwą "Input"

@page
@model CreateModel

Przypisanie formularza (input'ów) opiera się na

asp-for="Input.Title"
asp-for="Input.Name"

======================================
BTW. Zamiast kliknąć zapisz kliknąłem anuluj. Wisze piwo dla tego, kto zaimplementował zapamiętywanie treści edycji nawet po kliknięciu "anuluj"!

1 użytkowników online, w tym zalogowanych: 0, gości: 1