剃刀页面在服务器验证没有一些领域对回国(Razor Pages On Server Validati

2019-09-30 16:48发布

我在用剃刀页面(ASP.Net核2.0)的服务器端验证问题

我有一个创建一个记录页面

HTTP://本地主机:56876 /只/创建雇员= 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");
            }

我的服务器端验证工作,但问题是,当我返回页面(); 该表格被刷新,并且两个选择元素得到空出和雇员元素获得空出来为好。

我的猜测是,返回页面()上OnPostAsync()不调用使用onGET()方法。

我怎样才能让网页,因为它是没有松动的信息?

Answer 1:

你是正确的return Page()不调用OnGet()方法。 I'll试图解释发生了什么:

答案很简单:

当您收到POST请求( OnPost()return Page()服务器刚刚返回响应(HTML),它不会使一个新的Get请求,以便OnGet()再次调用。

两个选择元素被cleant因为它们在建立OnGet()通过ViewData (即暂时的)不在OnPost() 我的建议是你设置的“选择”再次OnPost()解压缩到一个方法,使其更容易)。

长一点的回答:

当您使用通过键入或重定向访问你的页面(只/创建)通过一个链接时,浏览器请求的网页服务器的HTTP GET方法,这将调用OnGet方法。 之后,当你把你的形式(考虑method="POST" )的请求将被发送到服务器,并通过捕获OnPost方法。

当你的代码return Page()它不发送回浏览器的响应说:“嘿,你必须重新做一个GET请求(什么会让OnGet再次调用)”,它返回结束响应(HTML)本身。 That's为什么OnGet()不会被调用。 什么会令OnGet()被调用再次将return RedirectToPage("./Entities/Create")但这样做你会失去你的模型状态(验证结果)。

两个选择元素被cleant因为它们在建立OnGet()通过ViewData (即暂时的)不在OnPost() 我的建议是你设置的“选择”再次OnPost()解压缩到一个方法,使其更容易)。

问候。



Answer 2:

你可以简单地调用OnGetOnPost方法,即:

if (!ModelState.IsValid) {
    return OnGet();
}

这对我的作品在ASP.NET 2.2的核心,并保留所有验证错误。



文章来源: Razor Pages On Server Validation returning for without some fields