Понимание стойкости данных Razor - PullRequest
0 голосов
/ 24 марта 2020

В настоящее время я изучаю бритвенные страницы, и я застрял с этим вопросом:

  • У меня есть собственный класс, который содержит кластер членов, включая массивы других пользовательских классов.

  • Они запускаются после запуска страницы. После этого пользователь может изменить значения или добавить или удалить строки массива.

  • Однако, как только пользователь подтверждает изменения, OnPost выдает исключение, как будто массивы никогда не инициировались.

Как лучше всего решить эту проблему?

Пример кода:

    [BindProperty(SupportsGet = true)]
    public long UID { get; set; }

    [BindProperty(SupportsGet = true)]
    public int UDEP { get; set; }

    [BindProperty]
    public int nExpenses { get; set; }

    // Custom object
    [BindProperty]
    public Employee Employee { get; set; }

    public void OnGet()
    {
        Employee = new Employee(UID, UDEP);

        // Loading arrays data from a Database
        Employee = Employee.ExtractPersonalData(UID);
        Employee.Expenses.ExtractSheet(Month, Year, Employee.ID);
        Employee.Expenses.ExtractBoard();
        Employee.Expenses.ExtractProjects(Month, Employee.ID);
            // There are 1 boards and 4 projects with 30 decimal[] each

        nExpenses = Employee.Expenses.Boards.Count > 0 ? Employee.Expenses.Boards[0].Projects.Count : 0;
    }


    public IActionResult OnPost()
    {
        // All variables within Employee equal NULL
        if(nExpenses < Employee.Expenses.Boards[0].Projects.Count)
            DeleteRow();
        else if (nExpenses > Employee.Expenses.Boards[0].Projects.Count)
            AddRows();

        Employee.Expenses.SaveSheet();
    }

1 Ответ

0 голосов
/ 25 марта 2020

Вы должны держать данные, передаваемые методом OnGet в поле зрения (например, hidden controls), затем передавать их в метод OnPost, а метод OnPost должен receive parameter из поля зрения, чтобы получить данные в методе OnGet.

Я создал простую демонстрацию для вашей справки:

  [BindProperty]
    public Employee Employee { get; set; }

    public void OnGet()
    {
        Employee = new Employee()
        {
            Id = 1,
            Name = "aaaa"
        };
        nExpenses = 1;
    }


    public void OnPost(Employee employee)
    {
    }

Представление:

@page
@model WebApplication_core_razorpage.Pages.CodeSampleModel
@*
    For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@
<form method="post">
    @Html.HiddenFor(model => model.Employee.Id)
    @Html.HiddenFor(model => model.Employee.Name)
    <input id="Button1" type="submit" value="button" />
</form>

Класс сотрудника:

public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

Вот процесс отладки:

enter image description here

...