服务器验证上的Razor页返回,但没有某些字段

服务器验证上的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

我在使用Razor页面(ASP.Net Core 2.0)进行服务器端验证时遇到问题

我有一个创建记录的页面

我的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");
            }
公共异步任务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上加载选择框,其他人?快速简单的回答对我有效!谢谢:)