服务器验证上的Razor页返回,但没有某些字段
我在使用Razor页面(ASP.Net Core 2.0)进行服务器端验证时遇到问题 我有一个创建记录的页面 我的OnGet代码隐藏文件如下所示:服务器验证上的Razor页返回,但没有某些字段,razor,asp.net-webpages,asp.net-core-2.0,Razor,Asp.net Webpages,Asp.net Core 2.0,我在使用Razor页面(ASP.Net Core 2.0)进行服务器端验证时遇到问题 我有一个创建记录的页面 我的OnGet代码隐藏文件如下所示: [BindProperty] public EntryLog EntryLog { get; set; } public Employee Employee{ get; set; } public string empID { get; set; } public IActionRe
[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");
}
公共异步任务OnPostAsync()
{
//查找当前员工ID hiredDate。如果是新员工,则不继续。
Employee=await\u context.Employee.FirstOrDefaultAsync(p=>p.Id==EntryLog.EmployeeID);
//服务器端验证
var age=DateTime.Day.Day-Employee.HireDate.Day;
如果(age您是对的,
returnpage()
没有调用OnGet()
方法。我将尝试解释发生了什么:
简短回答:
当您收到Post请求(OnPost()
)和return Page()
时,服务器只返回响应(html),它不会发出新的Get请求,以便再次调用OnGet()
这两个selects元素正在被清除,因为它们是在OnGet()
中通过ViewData
(这是临时的)而不是在OnPost()
中设置的。我的建议是您在OnPost()
上再次设置“selects”(提取到一个方法以使其更简单)
长答案:
当您通过键入或通过链接重定向来访问页面(条目/创建)时,浏览器使用HTTP方法GET向服务器请求页面,该方法将调用OnGet
方法。之后,当您发送表单时(考虑METHOD=“POST”
)请求将被发送到服务器,并由OnPost
方法捕获
当您编写return Page()
代码时,它并没有向浏览器发回一个响应,说“嘿,您必须再次发出GET请求(怎样才能再次调用OnGet
),而是返回结束响应(html)本身。这就是为什么OnGet()
没有被调用的原因。OnGet()
再次调用将是返回RedirectToPage(“./Entities/Create”)
,但这样做会丢失模型状态(验证结果)
这两个selects元素正在被清除,因为它们是在OnGet()
中通过ViewData
(这是临时的)而不是在OnPost()
中设置的。我的建议是您在OnPost()
上再次设置“selects”(提取到一个方法以使其更简单)
关于。您可以通过
OnPost
方法调用OnGet
,即:
if (!ModelState.IsValid) {
return OnGet();
}
这在ASP.NET Core 2.2中适用于我,并保留所有验证错误。您的方法没有任何模型?我无法在Post上加载选择框,其他人?快速简单的回答对我有效!谢谢:)