2017-08-16 51 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,其他人? –