2013-01-17 89 views
0

這應該是一個非常簡單的問題,因爲我是一個noob,幾乎已經找到了自己。我正在對數據庫中的信息進行身份驗證,我只想將該行的數據顯示到視圖中。我真的不確定如何在控制器中創建一個具有行數據的變量,並將該變量調用到視圖中,以便我可以在屏幕上看到行信息。MVC將行數據顯示到視圖

謝謝大家,希望能儘快好起來!

我的模型:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
namespace Mybasicvalidator.Models 
{ 
public class Class1 
    { 
    [Required] 
    public int id { get; set; } 
    public string fname {get; set;} 
    public string lname { get; set; } 
    public string email { get; set; } 
    public string username { get; set; } 
    public string password { get; set; } 
    } 
} 

我的控制器:

using Mybasicvalidator.Models; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Security; 
namespace Mybasicvalidator.Controllers 
{ 
public class homeController : Controller 
{ 
    // 
    // GET: /home/ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(); 
     return Content("Login Page"); 
    } 
    [HttpPost] 
    public ActionResult Index(Class1 modelle) 
    { 
     if (ModelState.IsValid) 
     { 
      if (DataAccess.DAL.CheckUser(modelle.fname)) 

      { 
      return RedirectToAction("Index", "profile"); 
      } 

      { 
       return Content("FAIL"); 
      } 
     } 
     return View(); 
    } 
} 
} 

我的數據訪問層(DAL):

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 


namespace Mybasicvalidator.DataAccess 
{ 
    public class DAL 
    { 
    static SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString()); 

    public static bool CheckUser(string fname) 
    { 
     bool authenticated = false; 

     string query = string.Format("SELECT * FROM [tbl_user] WHERE fname = '{0}'", fname); 

     SqlCommand cmd = new SqlCommand(query, conn); 
     conn.Open(); 
     SqlDataReader sdr = cmd.ExecuteReader(); 
     authenticated = sdr.HasRows; 

      conn.Close(); 
     return (authenticated); 
    } 

} 
} 

所以我知道這是閱讀的行和檢查對我的行進行身份驗證,那麼如何將數據行帶入視圖?我對此很新,並且已經嘗試了一個星期來完成它,所以我希望能夠遵循一些代碼。

再次感謝

+0

不太清楚你想要什麼。你問如何從數據庫中提取特定數據? – Botonomous

+0

@Anon我可以提取數據,我只想查看數據(數據庫行) – Batsu

回答

0

您正在離開ViewModel。

在MVC應用程序:

  • 控制器選擇正確的視圖,構建視圖模型,然後將其傳遞給視圖。
  • 視圖模型包含視圖將顯示的信息/數據。
  • 該視圖包含實際顯示來自ViewModel的數據的標記。

控制器:

[HttpGet] 
public ActionResult Index(int userId) 
{ 
    return View(new UserViewModel(userId)); 
} 

視圖模型:

public class UserViewModel { 
    public UserViewModel(int userId) { 
     UserToDisplay = UserRepository.GetUserById(userId); 
    } 

    public User UserToDisplay { get; set; } 
} 

查看:

@model UserViewModel; 

Hello @model.UserToDisplay.FirstName! 
+0

Hi Heather,我將'View Model'代碼放在Model文件夾的Class1.cs文件中,但是'UserRepository'doesn在當前的情況下不存在。 'User':( – Batsu

+0

「UserRepository」和「User」是用於這個例子的虛擬類,用你正在使用的任何倉庫以及你想要顯示的任何類來替換它們。 – Heather

0

你可以有你的DAL方法返回模型:

public class DAL 
{ 
    public static Class1 GetUser(string fname) 
    { 
     var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString(); 
     using (var conn = new SqlConnection(connectionString)) 
     using (var cmd = conn.CreateCommand()) 
     { 
      conn.Open(); 
      cmd.CommandText = "SELECT * FROM [tbl_user] WHERE fname = @fname"; 
      cmd.Parameters.AddWithValue("@fname", fname); 
      using (var reader = cmd.ExecuteReader()) 
      { 
       if (!reader.Read()) 
       { 
        return null; 
       } 

       var user = new Class1(); 
       user.id = reader.ReadInt32(reader.GetOrdinal("id")); 
       user.fname = reader.ReadString(reader.GetOrdinal("fname")); 
       ... and so on for the other properties 
       return user; 
      } 
     } 
    } 
} 

請注意,我如何使用參數化查詢來避免代碼易受攻擊的SQL注入。

然後被執行認證控制器動作,你可以發出一個窗體身份驗證cookie,如果重定向之前成功:

[HttpPost] 
public ActionResult Index(Class1 modelle) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = DataAccess.DAL.GetUser(modelle.fname); 
     if (user != null) 
     { 
      FormsAuthentication.SetAuthCookie(modelle.fname, false); 
      return RedirectToAction("Index", "profile"); 
     } 
     return Content("FAIL"); 
    } 
    return View(modelle); 
} 

,並在你的目標控制器動作,現在可以用[Authorize]裝飾屬性作爲唯一的身份驗證最後

public class ProfileController: Controller 
{ 
    [Authorize] 
    public ActionResult Index() 
    { 
     var user = DataAccess.DAL.GetUser(User.Identity.Name); 
     return View(user); 
    } 
} 

在相應視圖:用戶可以訪問它

@model Class1 
<div> 
    Hello @Html.DisplayFor(x => x.fname) 
</div> 
相關問題