将模型中的列表值返回到控制器,其中列表显示在bool类中

时间:2015-12-02 20:20:38

标签: asp.net-mvc

我正在尝试从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函数内返回它。

1 个答案:

答案 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?)中。

还有许多其他事情可以改进,但希望这是一个开始。