Razor Pages On Server Validation 返回时没有某些字段
Razor Pages On Server Validation returning for without some fields
我在使用 Razor Pages (ASP.Net Core 2.0)
进行服务器端验证时遇到问题
我有一个创建记录的页面
http://localhost:56876/Entries/Create?employeeID=112345
我的 OnGet 文件隐藏代码如下所示:
[BindProperty]
public EntryLog EntryLog { get; set; }
public Employee Employee{ get; set; }
public string empID { get; set; }
public IActionResult OnGet(string employeeID)
{
empID = employeeID;
// for Selects for lookup tables
ViewData["ReasonId"] = new SelectList(_context.Reason, "Id", "Name");
ViewData["ReasonTypeId"] = new SelectList(_context.ReasonType, "Id", "Name");
return Page();
}
上面的代码工作正常,客户端验证工作完美,但我有业务逻辑验证,如果进入日期是今天日期和受雇日期之间的 90,我不应该让条目被保存。
public async Task<IActionResult> OnPostAsync()
{
//Lookup current employeeID hiredDate. if is new employee do not continue.
Employee = await _context.Employee .FirstOrDefaultAsync(p => p.Id == EntryLog.EmployeeID);
//Server side validation
var age = DateTime.Today.Day - Employee.HireDate.Day;
if (age <= 90)
{
ModelState.AddModelError("NewEmp", "Emp is New Warning");
return Page();
}
if (!ModelState.IsValid)
{
return Page();
}
_context.EntryLog.Add(EntryLog);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
我的服务器端验证有效,但问题是当我 return Page();
表单被刷新,两个选择元素被清空,EmployeeID 元素也被清空。
我的猜测是 return OnPostAsync() 上的 Page() 没有调用 OnGet() 方法。
如何在不丢失信息的情况下保持页面原样?
你是对的 return Page()
没有调用 OnGet()
方法。我将尝试解释发生了什么:
简答:
当您收到 Post 请求 (OnPost()
) 并且 return Page()
服务器只是 returns 响应 (html) 时,它不会一个新的获取请求,以便 OnGet()
再次被调用。
两个选择元素正在清理,因为它们是在 OnGet()
到 ViewData
中设置的(这是临时的)而不是在 OnPost()
中。我的建议是您在 OnPost()
上再次设置 "selects"(提取到一种方法以使其更容易)。
长答案:
当您通过键入或通过 link 重定向访问您的页面 (Entries/Create) 时,浏览器使用 HTTP METHOD GET 向服务器请求页面,这将调用 OnGet
方法。之后,当您发送表单(考虑 method="POST"
)时,请求将被发送到服务器并被 OnPost
方法捕获。
当您编码 return Page()
时,它不会将响应发送回浏览器说 "Hey, you have to make a GET request again (what would make OnGet
be called again)",而是返回结束响应 (html) 本身。这就是 OnGet()
没有被调用的原因。再次调用 OnGet()
的是 return RedirectToPage("./Entities/Create")
,但这样做会丢失模型状态(验证结果)。
两个选择元素正在清理,因为它们是在 OnGet()
到 ViewData
中设置的(这是临时的)而不是在 OnPost()
中。我的建议是您在 OnPost()
上再次设置 "selects"(提取到一种方法以使其更容易)。
此致。
您只需从 OnPost
方法中调用 OnGet
,即:
if (!ModelState.IsValid) {
return OnGet();
}
这对我来说适用于 ASP.NET Core 2.2 并保留所有验证错误。
我在使用 Razor Pages (ASP.Net Core 2.0)
进行服务器端验证时遇到问题我有一个创建记录的页面
http://localhost:56876/Entries/Create?employeeID=112345
我的 OnGet 文件隐藏代码如下所示:
[BindProperty]
public EntryLog EntryLog { get; set; }
public Employee Employee{ get; set; }
public string empID { get; set; }
public IActionResult OnGet(string employeeID)
{
empID = employeeID;
// for Selects for lookup tables
ViewData["ReasonId"] = new SelectList(_context.Reason, "Id", "Name");
ViewData["ReasonTypeId"] = new SelectList(_context.ReasonType, "Id", "Name");
return Page();
}
上面的代码工作正常,客户端验证工作完美,但我有业务逻辑验证,如果进入日期是今天日期和受雇日期之间的 90,我不应该让条目被保存。
public async Task<IActionResult> OnPostAsync()
{
//Lookup current employeeID hiredDate. if is new employee do not continue.
Employee = await _context.Employee .FirstOrDefaultAsync(p => p.Id == EntryLog.EmployeeID);
//Server side validation
var age = DateTime.Today.Day - Employee.HireDate.Day;
if (age <= 90)
{
ModelState.AddModelError("NewEmp", "Emp is New Warning");
return Page();
}
if (!ModelState.IsValid)
{
return Page();
}
_context.EntryLog.Add(EntryLog);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
我的服务器端验证有效,但问题是当我 return Page(); 表单被刷新,两个选择元素被清空,EmployeeID 元素也被清空。
我的猜测是 return OnPostAsync() 上的 Page() 没有调用 OnGet() 方法。
如何在不丢失信息的情况下保持页面原样?
你是对的 return Page()
没有调用 OnGet()
方法。我将尝试解释发生了什么:
简答:
当您收到 Post 请求 (OnPost()
) 并且 return Page()
服务器只是 returns 响应 (html) 时,它不会一个新的获取请求,以便 OnGet()
再次被调用。
两个选择元素正在清理,因为它们是在 OnGet()
到 ViewData
中设置的(这是临时的)而不是在 OnPost()
中。我的建议是您在 OnPost()
上再次设置 "selects"(提取到一种方法以使其更容易)。
长答案:
当您通过键入或通过 link 重定向访问您的页面 (Entries/Create) 时,浏览器使用 HTTP METHOD GET 向服务器请求页面,这将调用 OnGet
方法。之后,当您发送表单(考虑 method="POST"
)时,请求将被发送到服务器并被 OnPost
方法捕获。
当您编码 return Page()
时,它不会将响应发送回浏览器说 "Hey, you have to make a GET request again (what would make OnGet
be called again)",而是返回结束响应 (html) 本身。这就是 OnGet()
没有被调用的原因。再次调用 OnGet()
的是 return RedirectToPage("./Entities/Create")
,但这样做会丢失模型状态(验证结果)。
两个选择元素正在清理,因为它们是在 OnGet()
到 ViewData
中设置的(这是临时的)而不是在 OnPost()
中。我的建议是您在 OnPost()
上再次设置 "selects"(提取到一种方法以使其更容易)。
此致。
您只需从 OnPost
方法中调用 OnGet
,即:
if (!ModelState.IsValid) {
return OnGet();
}
这对我来说适用于 ASP.NET Core 2.2 并保留所有验证错误。