我正在尝试从employee表中获取名称和其他详细信息,其中包含用户名和密码,但我无法返回从bool函数内的数据库中获取的列表值。
MY MODEL是登录模型类,我只是声明模型:
namespace BusinessLayer
{
public class Login
{
public string EmployeeId { get; set; }
public string Name { get; set; }
public string UserType { get; set; }
public string Designation { get; set; }
public string Department { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public int ReportingToId { get; set; }
public string ReportingTo { get; set; }
}
}
我上面模型的另一个名为LoginBusinessLayer的模型是:
namespace BusinessLayer
{
public class LoginBusinessLayer
{
public string UserName { get; set; }
public string Password { get; set; }
public int Id { get; set; }
public bool IsValid(string _username, string _password)
{
string cnn = ConfigurationManager.ConnectionStrings["connectionstring"].ConnectionString;
List<Login> login = new List<Login>();
using (SqlConnection conn=new SqlConnection(cnn))
{
string _sql = @"SELECT *,AddUserType.UserType From Employee inner join AddUserType ON AddUserType.Id = Employee.UserTypeId " +
@"WHERE [UserName] = @u AND [Password] = @p";
var cmd = new SqlCommand(_sql, conn);
cmd.Parameters
.Add(new SqlParameter("@u", SqlDbType.VarChar))
.Value = _username;
cmd.Parameters
.Add(new SqlParameter("@p", SqlDbType.VarChar))
.Value =_password;
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Login logi = new Login();
logi.EmployeeId = rdr["EmpId"].ToString();
logi.Name = rdr["Name"].ToString();
logi.UserType = rdr["UserType"].ToString();
login.Add(logi);
}
return login; // HERE I WILL GET ERROR BECAUSE I CANT CONVERT LIST TO BOOL
if (rdr.HasRows)
{
rdr.Dispose();
cmd.Dispose();
return true;
}
else
{
rdr.Dispose();
cmd.Dispose();
return false;
}
}
}
}
}
我的控制器类名为Login:
namespace PMS_Rotary.Controllers
{
public class LoginController : Controller
{
//
// GET: /Login/
[HttpGet]
public ActionResult Login()
{
return View();
}
[HttpPost]
public ActionResult Login(LoginBusinessLayer log)
{
string Name = "";
string EmployeeId = "";
string UserType = "";
if (ModelState.IsValid)
{
if (log.IsValid(log.UserName, log.Password))
{
List<Login> login = new List<Login>();
foreach (var i in login)
{
Name = i.Name;
EmployeeId = i.EmployeeId;
UserType = i.UserType;
}
Session["Name"] = Name;
Session["EmployeeId"] = EmployeeId;
Session["UserType"] = UserType;
return RedirectToAction("Homepage","Homepage");
}
else
{
ModelState.AddModelError("", "Credentials are invalid");
}
}
return View(log);
}
}
}
这是我的问题 - 代码使用模型中的列表正确获取所有数据,但我无法在bool函数内返回它。
答案 0 :(得分:0)
您的代码可以进行很多改进。我只会回答你的问题。最简单的解决方案是更改IsValid
方法以返回Login对象而不是bool。在您的控制器中,如果它不为空,您知道凭据有效。你期望一个List<Login>
,我不明白(我假设你的SQL查询会返回一个或没有)。然后,您可以将该Login对象的id传递给Homepage
操作,并摆脱讨厌的Session变量。
if (ModelState.IsValid)
{
var user = log.IsValid(log.UserName, log.Password);
if(user != null)
{
return RedirectToAction("Homepage","Homepage", new {id = user.EmployeeId});
}
else
{
ModelState.AddModelError("", "Credentials are invalid");
}
}
在您的主页操作中,从路由中获取ID并查询数据库以获取相应的登录信息。
建议:Login
行动不应该LoginBusinessLayer
。将您的Login
课程更改为仅包含与登录相关的内容(用户名和密码)。创建一个单独的类(Employee?User?)来保存当前在Login
类中的属性。获取负责打开数据库连接和查询的代码,并将其放在一个单独的类(EmployeeService?)中。
还有许多其他事情可以改进,但希望这是一个开始。