2017-08-16 46 views
1

我在用剃刀页的服务器端验证的问题(ASP.Net核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"); 
      } 

我的服务器端验证工程,但问题是,当我返回Page(); 表单被刷新,两个选择元素被清空,EmployeeID元素也被清空。

我的猜测是OnPostAsync()上的返回Page()没有调用OnGet()方法。

如何在不丢失信息的情况下保持原样?

+0

您的方法没有任何模型? – Hadee

回答

0

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

答案很简单:

当您收到POST请求(OnPost())和return Page()服务器直接返回响应(HTML),它不会使新获取请求,以便OnGet()再次被调用。

这两个选择元素正在清理,因为它们是在OnGet()ViewData(这是临时的)而不是在OnPost()中设置的。我的建议是,你在OnPost()上再次设置“选择”(提取到一个方法使其更容易)。

龙答:

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

当您编码return Page()时,它不会向浏览器发送回应,说“嘿,您必须再次发出GET请求(会使OnGet再次被调用)”,它会返回结束响应(html)本身。这就是为什么OnGet()没有被调用。什么会使OnGet()被再次调用将是return RedirectToPage("./Entities/Create"),但这样做会失去模型状态(验证结果)。

这两个选择元素正在清理,因为它们是在OnGet()ViewData(这是临时的)而不是在OnPost()中设置的。我的建议是,你在OnPost()上再次设置“选择”(提取到一个方法使其更容易)。

问候。

+0

谢谢。我明白这一点,但很好的解释。 – causita

+0

我无法让它工作加载选择框onPost,其他人? –