我在使用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()方法。
如何在不丢失信息的情况下保持页面不变?
答案 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中对我有效,并且保留了所有验证错误。