0

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

谢谢大家,希望能尽快好起来!

我的模型:

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

}
}

所以我知道它正在读取行并针对我的行检查身份验证,那么如何将数据行带到视图中呢?我对此很陌生,并且已经尝试了一周的时间来实现它,所以我很感激我可以遵循一些代码。

再次感谢

4

2 回答 2

0

您将忽略 ViewModel。

在 MVC 应用程序中:

  • Controller 选择正确的视图,构造视图模型,然后将其传递给视图。
  • 视图模型包含视图将显示的信息/数据。
  • View 包含实际显示来自 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!
于 2013-01-17T21:45:37.643 回答
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>
于 2013-01-17T21:46:23.617 回答