从 foreach 循环 ASP.NET Core 5.0 返回一个变量

Posted

技术标签:

【中文标题】从 foreach 循环 ASP.NET Core 5.0 返回一个变量【英文标题】:Returning a variable from a foreach-loop ASP.NET Core 5.0 【发布时间】:2021-12-21 10:12:24 【问题描述】:

我正在尝试从 foreach 循环返回密码以进行一些验证,但我无法让密码变量返回。我不断收到错误。我在控制器中执行此操作。

我的代码:

[HttpPost]
public IActionResult Login(userModel user)

    ViewBag.Password = pwd.GetPassword(user);

    string password = "";
    foreach(var pwdR in ViewBag.Password.Rows)
    
       password = pwdR[1];
    
    return password; // Here I get this error: CS0029: Cannot implicitly convert type 'string' to 'Microsoft.AspNetCore.Mvc.IActionResult'

    // VALIDATION CODE
    ....................

我做错了什么?

谢谢!

更新:

[HttpPost]
public IActionResult Login(userModel user)

    ScryptEncoder enc = new ScryptEncoder();
    UserModel pwd = new UserModel();
    ViewBag.Password = pwd.GetPassword(user);

    string password = "";
    foreach(var pwdR in ViewBag.Password.Rows)
    
       password = pwdR[1];
    
    return password; // Here I get this error: CS0029: Cannot implicitly convert type 'string' to 'Microsoft.AspNetCore.Mvc.IActionResult'

    // VALIDATION CODE
    bool match = enc.Compare(user.pwd, password);

    if (match) 
    
        ViewBag.Error = "You are now logged in.";
        return View();
     else
    
        ViewBag.Error = "Login failed.";
        return View();
    

【问题讨论】:

因此您可以使用ActionResult<string>。但无论如何,从安全角度来看,在客户端返回密码确实是个坏主意。更好地在服务器端运行验证。 如果您想了解更多关于 asp.net core 中的身份验证的信息,阅读 Microsoft 文档可能会很有用 :) docs.microsoft.com/en-us/aspnet/core/security/authentication/… @mike 我已经阅读并尝试过使用 Identity,但我必须在这个项目中使用 mysql,这使事情变得很复杂。我花了几天时间尝试使用 Identity 进行注册和登录,但我遇到了很多复杂情况,所以我决定这样做。我已经有一个完成的数据库要连接,所以我不想创建新表。如果我可以使用 Sql 数据库,一切都会变得容易得多。 @AndrewSilver 我会试试的。谢谢。 你能解释一下这个代码字符串密码=“”有什么意义吗? foreach(ViewBag.Password.Rows 中的 var pwdR) 密码 = pwdR[1]; ? 【参考方案1】:

加载所有用户并找到您需要的用户是一个很大的性能错误。

试试这个代码

[HttpPost]
public IActionResult Login(UserModel user)

    ScryptEncoder enc = new ScryptEncoder();

      var userNamePassword= GetUserNamePassword (user) ;

  if(  userNamePassword==null)
    ViewBag.Error = "Login failed. User is not found";
    return View();

    // VALIDATION CODE
    bool match = enc.Compare(userNamePassword.Password, password);

    if (match) 
    
        ViewBag.Error = "You are now logged in.";
        return View();
     else
    
        ViewBag.Error = "Login failed.";
        return View();
    

把你的模型类改成这个

 public class UserNamePasswordModel
    
        public string Username  get; set; 

        public string Password  get; set; 

     

将此代码放置在登录操作附近的某处

private  UserNamePasswordModel GetUserNamePassword (UserModel user)


UserNamePasswordModel  userNamePassword= null;

var connectionString = "Server=localhost;Database=xxxx; uid = xxxx;Password=xxxx;";
        
using   (var connection = new MySqlConnection(connectionString))

  var command =  new MySqlCommand("SELECT UserName, Password  FROM User WHERE Username = @Username", connection);

command.Parameters.AddWithValue("@Username", user.Username);

        connection.Open();

       var reader = command.ExecuteReader();

        if (reader.HasRows)
        
           if reader.Read()
            
             userNamePassword= new UserNamePasswordModel
             
              Username=  reader.GetString(0),
               Password =   reader.GetString(1)
             ;
            
        
        
        reader.Close();
    

    return userNamePassword;
       

【讨论】:

哇,非常感谢!这也奏效了。我真的很感谢你抽出时间!非常感谢。【参考方案2】:

尝试返回 Ok 并输入密码,例如:return Ok(password);

【讨论】:

删除了错误,但其下的代码无法访问。在同一个控制器中返回密码后,我正在尝试进行一些验证。 也许您可以分享更多关于其余代码的信息以及您正在尝试执行的验证类型 现在更新了。这就是全部代码。

以上是关于从 foreach 循环 ASP.NET Core 5.0 返回一个变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 3.1 中逐行迭代列表

使用asp.net mvc将html foreach循环数据转换为webgrid

要在 ASP .NET Core MVC 中查看的 JavaScript 中的对象数组

TSQL 多个连接与来自 ASP.NET Core 的多个请求?

在 ASP.NET Core 中检测到自引用循环 [重复]

ASP.NET CORE 中的 Request.Files