2017-08-16 4 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()を返すときです。 フォームがリフレッシュされ、2つのselect要素が空になり、EmployeeID要素も空になります。

私の推測では、OnPostAsync()のPage()がOnGet()メソッドを呼び出していないと思います。

どうすれば情報を失うことなくページをそのまま維持できますか?

+0

あなたのメソッドのモデルはありませんか?ありがとうございます。 – Hadee

答えて

0

あなたはreturn Page()の場合、OnGet()メソッドを呼び出すことはありません。

短い答え:あなたはPOSTリクエスト(OnPost())を受信し、return Page()サーバはちょうど応答(HTML)を返すとき

、それは新しいことはありません - 私は何が起こっているのかを説明しようOnGet()が再度呼び出されるようにリクエストを取得します。

OnPost()にないOnGet()ViewData(一時的なもの)に設定されているため、2つの選択要素がクリアされています。私の提案は、あなたがOnPost()(これを簡単にするために抽出する)で "選択"を再度設定することです。

ロング回答:HTTPメソッドを使用してサーバーに

あなたが入力するか、リンクを介してリダイレクトされることにより、あなたのページ(エントリの作成/)にアクセスし、ブラウザの要求ページOnGetメソッドを呼び出しますされ、GET 。その後、あなたのフォーム(method="POST"を考慮して)を送信すると、リクエストはサーバに送信され、OnPostメソッドによってキャッチされます。

return Page()をコード化すると、「やあ、GETリクエストをもう一度行う必要がありますか(OnGetを再度呼び出すにはどうすればいいでしょうか?」というメッセージがブラウザに返されません。自体。だからOnGet()が呼び出されていないのです。 OnGet()をもう一度呼び出すと、return RedirectToPage("./Entities/Create")になりますが、そうすることでモデルの状態(検証結果)が失われます。

OnPost()にないOnGet()ViewData(一時的なもの)に設定されているため、2つの選択要素がクリアされています。私の提案は、あなたがOnPost()(これを簡単にするために抽出する)で "選択"を再度設定することです。

よろしくお願いいたします。

+0

私はそれを理解しましたが、良い説明です。 – causita

+0

私は選択ボックスonPostを読み込むことができませんでした、他の誰ですか? –