【问题标题】:Understanding Razor data persistance了解 Razor 数据持久性
【发布时间】:2020-07-05 05:33:17
【问题描述】:

我目前正在学习剃须刀页面,但我遇到了这个问题:

  • 我有一个自定义类,其中包含一组成员,包括 其他自定义类的数组。

  • 它们会在页面启动后启动。之后,用户可以 更改值或添加或删除数组行。

  • 但是,一旦用户确认更改,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();
    }

【问题讨论】:

  • GetPost 是不同的操作,除非您将所有获取数据发布回来,否则您将无法访问它。

标签: c# html asp.net-core razor-pages


【解决方案1】:

您应该将 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; }
    }

调试过程如下:

【讨论】:

  • 这解决了它。非常感谢您提供演示样本。
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 2011-02-28
  • 1970-01-01
  • 2011-04-21
相关资源
最近更新 更多