2015-12-02 18 views
0

我試圖從僱員表中獲取名稱和其他詳細信息,其中用戶名和密碼顯示在列表中,但我無法返回列表值從bool函數中的數據庫中獲取。將模型中的列表值返回給控制器,其中列表呈現在布爾類內

我的模型在登錄模型類,在這裏我只是聲明型號:

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; 
       } 
      } 
     } 
    } 
} 

,並命名爲我的控制器類作爲登錄:

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); 
    } 

    } 
} 

這是我的問題 - 代碼正確地提取al l使用模型中的列表的數據,但我不能在bool函數中返回它。

回答

0

可以對代碼進行很多改進。我只會回答你的問題。最簡單的解決方案是將您的IsValid方法更改爲返回Login對象而不是bool。在您的控制器中,如果它不爲空,則您知道憑據是有效的。你期望List<Login>,我不明白(我假設會有一個或沒有從您的SQL查詢返回)。然後,您可以將該登錄對象的ID傳遞給您的Homepage操作並擺脫討厭的會話變量。

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

還有很多其他的事情可以改進,但希望這是一個開始。

相關問題