MVC将行的数据显示给视图

时间:2013-01-17 21:36:04

标签: c# asp.net-mvc-4 sqldatareader

这应该是一个非常简单的问题,因为我是一个菜鸟,几乎让它自己弄清楚了。我正在对数据库中的信息进行身份验证,我想简单地将行的数据显示到视图中。我真的不确定如何,我假设,在控制器中创建一个具有行数据的变量,并将该变量调用到视图中,以便我可以在屏幕上看到行信息。

谢谢大家,希望尽快变得更好!

我的模特:

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

}
}

所以我知道它正在读取行并检查我的行的身份验证,那么如何将数据行带到视图中?我对此非常陌生,已经尝试了一个星期才能实现它,所以我很感激我可以遵循的一些代码。

再次感谢

2 个答案:

答案 0 :(得分:0)

您将遗漏ViewModel。

在MVC应用程序中:

  • Controller选择正确的视图,构造视图模型,然后将其传递给视图。
  • 视图模型包含视图将显示的信息/数据。
  • 视图包含实际显示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!

答案 1 :(得分: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>