尝试使用CSHTML做一个非常基本的登录页面,但我可以';我的if语句不能正常工作
本文关键字:我的 我可以 if 工作 常工作 语句 不能 登录 CSHTML 一个 非常 | 更新日期: 2023-09-27 17:57:34
@{
Page.Title = "Log in";
// Generate page variables
var db = Database.Open("calcinema");
var email = "";
var password = "";
var getAcc = db.Query("SELECT * FROM Account;");
if (IsPost && Validation.IsValid()) {
email = @Request.Form["email"];
password = @Request.Form["password"];}
foreach (var a in getAcc) {
if (email == a.Email && password == a.Password){
Response.Redirect("~/Browse.cshtml");}
}
}
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<table border="0" align="center">
<tr>
<td>
<form name="login" action="" method="get" accept-charset="utf-8">
<label for="email">Email</label>
<input type="email" name="email" placeholder="yourname@email.com" required value = "@Request.Form["email"]">
<label for="password">Password</label>
<input type="password" name="password" placeholder="Password" required value = "@Request.Form["password"]">
<input type="submit" value="Login">
</form>
</td>
</tr>
</table>
</body>
页面加载,但无论电子邮件和密码是否有效,都不会发生任何事情。它只接受输入,然后将我返回到文本字段为空的登录页面,而不是将我重定向到Browse.cshtml页面。
问题在于表单的方法。您已经选择了GET
,它在QueryString中传递表单值。您正在查看Request.Form
集合,但这些值不存在。将方法更改为POST
。
您还需要确保正确查询数据库,并返回要由代码检查的结果。还有其他问题,即无法设置input type=password
的值,并且required
属性不适用于服务器端验证。
这里有一些代码是可行的,但我建议您花一些时间学习这里的教程,并学习网页的基础知识。这是一个很好的框架,但确实需要一些应用程序才能正确学习。
@{
Page.Title = "Log in";
if (IsPost && Validation.IsValid()) {
var email = Request.Form["email"];
var password = Request.Form["password"];
var db = Database.Open("calcinema");
var result = db.QueryValue("SELECT Count(*) FROM Account WHERE Email = @0 AND Password = @1", email, password);
if (result > 0){
Response.Redirect("~/Browse.cshtml");
}
}
}
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<table border="0" align="center">
<tr>
<td>
<form name="login" action="" method="post" accept-charset="utf-8">
<label for="email">Email</label>
<input type="email" name="email" placeholder="yourname@email.com" required value = "@Request.Form["email"]">
<label for="password">Password</label>
<input type="password" name="password" placeholder="Password" required>
<input type="submit" value="Login">
</form>
</td>
</tr>
</table>
</body>
您的问题可能是:
email = @Request.Form["email"];
password = @Request.Form["password"];
您不需要在Request
前面加上与号,因为您已经在服务器端代码中了:
email = Request.Form["email"];
password = Request.Form["password"];
你真的不应该这么做。您应该将这些值作为参数传递给SQL命令,然后查看是否匹配:
var result = db.QueryValue("SELECT COUNT(*) FROM Account WHERE email = @0 AND password = @1", email, password);
当然,有关SSL、纯文本密码和SQL注入保护的各种安全注意事项也适用。
这是因为您提供了if子句语句。使用此HTML表单的方法,该语句永远不会为真。你需要改变它。
看看
if (IsPost && Validation.IsValid()) {
email = @Request.Form["email"];
password = @Request.Form["password"];
}
foreach (var a in getAcc) {
if (email == a.Email && password == a.Password) {
Response.Redirect("~/Browse.cshtml");
}
}
仅当请求为POST
时,才需要执行@Request.Form["email"]
代码,但表单设置为method="get"
,这将始终跳过if块。
由于跳过了if块,您的代码将始终具有空字符串值或电子邮件和密码的初始值。因此,第二个if块也不会执行,也不会将您重定向到Browse.cshtml页面。