了解 Razer 数据持久性
Understanding Razor data persistance
我目前正在学习 razor pages,但遇到了这个问题:
我有一个自定义 class,其中包含一组成员,包括
其他自定义数组 classes.
它们在页面启动时启动。之后,用户可以
更改值或添加或删除数组行。
但是,一旦用户确认更改,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();
}
您应该将 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>
员工class:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
调试过程如下:
我目前正在学习 razor pages,但遇到了这个问题:
我有一个自定义 class,其中包含一组成员,包括 其他自定义数组 classes.
它们在页面启动时启动。之后,用户可以 更改值或添加或删除数组行。
但是,一旦用户确认更改,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();
}
您应该将 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>
员工class:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
调试过程如下: