Razor Pages On Server Validation返回没有一些字段

时间:2017-08-16 14:01:51

标签: razor asp.net-webpages asp.net-core-2.0

我在使用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");
            }

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

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

如何在不丢失信息的情况下保持页面不变?

2 个答案:

答案 0 :(得分:3)

return Page()没有调用OnGet()方法,你是对的。我会试着解释一下发生了什么:

简答:

当您收到Post请求(OnPost())和return Page()时,服务器只返回响应(html),它不会生成新的Get Request,以便再次调用OnGet()

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

长答案:

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

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

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

问候。

答案 1 :(得分:0)

您可以简单地通过string interpolation方法调用const SSH = require('simple-ssh'); const ssh_pwd = 'password' const dir_path = '/path/to/script/directory' const ssh = new SSH({ host: hostname, user: username, pass: password, // <-- If ssh_pwd is password to login to ssh this is where you should be passing baseDir: dir_path }); ssh.exec(`./myscript.sh --ask-pass ${ssh_pwd}` , { pty: true, out: function(stdout) { console.log(stdout); }, }).start() ,即:

OnGet

这在ASP.NET Core 2.2中对我有效,并且保留了所有验证错误。