尝试使用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页面。

尝试使用CSHTML做一个非常基本的登录页面,但我可以';我的if语句不能正常工作

问题在于表单的方法。您已经选择了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页面。

相关文章: