这应该是一个非常简单的问题,因为我是一个菜鸟,几乎让它自己弄清楚了。我正在对数据库中的信息进行身份验证,我想简单地将行的数据显示到视图中。我真的不确定如何,我假设,在控制器中创建一个具有行数据的变量,并将该变量调用到视图中,以便我可以在屏幕上看到行信息。
谢谢大家,希望尽快变得更好!
我的模特:
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 :(得分:0)
您将遗漏ViewModel。
在MVC应用程序中:
控制器:
[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>