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 并保留所有验证错误。