C# ASP.Net:寻找设计视图模型和模型代码的正确方法

C# ASP.Net:寻找设计视图模型和模型代码的正确方法,c#,asp.net-mvc,ado.net,C#,Asp.net Mvc,Ado.net,我是ASP.NETMVC的新手。在我的项目中,我没有使用实体框架,而是使用ADO.net。下面是我的视图模型设计代码。请看一看 行动 我的模型和视图模型代码 有人回顾了我的视图模型代码,说视图模型不应该包含实现视图模型是在客户端、控制器和视图之间传递数据的容器。 他给出了vm-code public class StudentVm { public int page { get; set; } public int RowCount { get; set; } publi

我是ASP.NETMVC的新手。在我的项目中,我没有使用实体框架,而是使用ADO.net。下面是我的视图模型设计代码。请看一看

行动 我的模型和视图模型代码 有人回顾了我的视图模型代码,说视图模型不应该包含实现<代码>视图模型是在客户端、控制器和视图之间传递数据的容器。

他给出了
vm-code

public class StudentVm
{
    public int page { get; set; }
    public int RowCount { get; set; }
    public int PageSize { get; set; }
    public int CurrentPage { get; set; }
    public string sort { get; set; }
    public string sortdir { get; set; }
    public IList<Student> Students { get; set; }
}

public class Student
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool IsActive { get; set; }
    public string StateName { get; set; }
    public string CityName { get; set; }
}

public ActionResult Index()
{
    return View();
}

[HttpPost]
public ActionResult Show1(StudentVm oSVm)
{
    return View(oSVm);
}
公共班级学生虚拟机
{
公共整型页{get;set;}
公共int行计数{get;set;}
公共int PageSize{get;set;}
public int CurrentPage{get;set;}
公共字符串排序{get;set;}
公共字符串sortdir{get;set;}
公共IList学生{get;set;}
}
公立班学生
{
公共int ID{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共bool IsActive{get;set;}
公共字符串StateName{get;set;}
公共字符串CityName{get;set;}
}
公共行动结果索引()
{
返回视图();
}
[HttpPost]
公共行动结果显示1(StudentVm oSVm)
{
返回视图(oSVm);
}
所以我的问题是把db交互例程放在哪里

我说的是这条线
公共IList GetStudents(StudentVm oSVm)
{
int StartIndex=0,EndIndex=0;
如果(oSVm.page==0)
oSVm.page=1;
StartIndex=((oSVm.page*oSVm.PageSize)-oSVm.PageSize)+1;
EndIndex=(oSVm.page*oSVm.PageSize);
CurrentPage=StartIndex;
if(string.IsNullOrEmpty(oSVm.sort))
oSVm.sort=“ID”;
if(string.IsNullOrEmpty(oSVm.sortdir))
oSVm.sortdir=“ASC”;
string ConnectionString=System.Configuration.ConfigurationManager.ConnectionString[“StudentDBContext”].ConnectionString;
IList_Student=新列表();

string strSQL=“从vwListStudents中选择ID、FirstName、LastName、IsActive、StateName、CityName,其中ID>=”+StartIndex+“和ID不要在视图模型中混合数据访问代码。这破坏了分离关注点的整体目的。引入视图模型的整体想法是不要将ORM端实体混合到视图层中

您的视图模型应该是精简的POCO/DTO类。这些DTO用于在一层到另一层之间传输数据。它不应该知道从哪里获取数据

您应该有另一个层/类,它将为您提供数据,并将实体映射到视图模型。如果您不喜欢手动映射,您可以使用像Automapper这样的映射库来实现这一点

您可以根据应用程序的复杂性,以多种不同的方式设计应用程序/层

您的项目。常见:此项目在您的项目中存储DTO/POCO。如果需要,您可以根据需要将视图模型保留在此处

YourProject.Data:此项目引用了您的公共项目,并以这些DTO类的形式返回数据

YourProject.Web/UI:您的Web/API项目。这将引用数据项目和Commin项目,并调用数据访问方法来获取数据。您可以在此处执行属性映射(从实体读取并设置为查看模型)

您可以向堆栈中添加更多层,例如在UI和数据访问之间添加一个业务/服务层,以执行一些业务逻辑/映射等


明智地使用分层,如果盲目地尝试创建许多实际上不需要的层,那么最终会导致混乱。

您需要做的第一件事是将db access代码从视图模型中移到存储库类中。请参见下面的示例:

public class WebGridSampleController
{
    private StudentRepository _data;

    public WebGridSampleController()
    {
        _data = new StudentRepository();
    }

    public ActionResult Show1(StudentVm oSVm)
    {
        var students = _data.GetStudents(oSVm.page, oSVm.pageSize, oSVm.sort, oSVm.sortDir);
        oSVm.Students = students.ToList();
        return View(oSVm);
    }
}

public class StudentRepository
{
    public IEnumerable<Student> GetStudents(int page, int pageSize, string sort, string sortDir)
    {
        // Put the code that you have in StudentVM.GetAllStudents here
    }
}
公共类WebGridSampleController
{
私人研究报告数据;
公共WebGridSampleController()
{
_数据=新的StudentRepository();
}
公共行动结果显示1(StudentVm oSVm)
{
var students=_data.GetStudents(oSVm.page、oSVm.pageSize、oSVm.sort、oSVm.sortDir);
oSVm.Students=Students.ToList();
返回视图(oSVm);
}
}
公共班级学生公寓
{
公共IEnumerable GetStudents(整型页面、整型页面大小、字符串排序、字符串排序)
{
//将您在StudentVM.GetAllStudents中的代码放在这里
}
}
您发布的代码还有其他问题。我认为大多数问题都归结为类和变量的命名不当。例如:这里的视图是什么?它不是查看特定学生的详细信息,是吗

所以,StudentVm(或者,StudentViewModel),可能应该命名为类似于StudentListViewModel的名称。此外,控制器可能应该命名为StudentController,因为它控制着学生的观看。此外,在我看来,Show1的动作应该称为类似于List的动作

考虑到这些因素,可以对示例进行如下更新:

public class StudentController
{
    private StudentRepository _data;

    public StudentController()
    {
        _data = new StudentRepository();
    }

    public ActionResult List(StudentListViewModel viewModel)
    {
        var students = _data.GetStudents(viewModel.Page, viewModel.PageSize, viewModel.Sort, viewModel.SortDirection);
        viewModel.Students = students.ToList();
        return View(viewModel);
    }
}

public class StudentRepository
{
    public IEnumerable<Student> GetStudents(int page, int pageSize, string sort, string sortDir)
    {
        // Put the code that you have in StudentVM.GetAllStudents here
    }
}
公共类学生控制器
{
私人研究报告数据;
公共学生控制员()
{
_数据=新的StudentRepository();
}
公共操作结果列表(学生列表视图模型视图模型)
{
var students=_data.GetStudents(viewModel.Page、viewModel.PageSize、viewModel.Sort、viewModel.SortDirection);
viewModel.Students=Students.ToList();
返回视图(viewModel);
}
}
公共班级学生公寓
{
公共IEnumerable GetStudents(整型页面、整型页面大小、字符串排序、字符串排序)
{
//将您在StudentVM.GetAllStudents中的代码放在这里
}
}
我们还可以讨论依赖注入的主题,bu
public class StudentVm
{
    public int page { get; set; }
    public int RowCount { get; set; }
    public int PageSize { get; set; }
    public int CurrentPage { get; set; }
    public string sort { get; set; }
    public string sortdir { get; set; }
    public IList<Student> Students { get; set; }
}

public class Student
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool IsActive { get; set; }
    public string StateName { get; set; }
    public string CityName { get; set; }
}

public ActionResult Index()
{
    return View();
}

[HttpPost]
public ActionResult Show1(StudentVm oSVm)
{
    return View(oSVm);
}
public IList<Student> GetStudents(StudentVm oSVm)
        {
            int StartIndex = 0, EndIndex = 0;

            if (oSVm.page == 0)
                oSVm.page = 1;

            StartIndex = ((oSVm.page * oSVm.PageSize) - oSVm.PageSize) + 1;
            EndIndex = (oSVm.page * oSVm.PageSize);
            CurrentPage = StartIndex;

            if (string.IsNullOrEmpty(oSVm.sort))
                oSVm.sort = "ID";

            if (string.IsNullOrEmpty(oSVm.sortdir))
                oSVm.sortdir = "ASC";

            string connectionStringName = System.Configuration.ConfigurationManager.ConnectionStrings["StudentDBContext"].ConnectionString;
            IList<Student> _Student = new List<Student>();

            string strSQL = "SELECT ID, FirstName,LastName,IsActive,StateName,CityName FROM vwListStudents WHERE ID >=" + StartIndex + " AND ID <=" + EndIndex;
            strSQL += " ORDER BY " + oSVm.sort + " " + oSVm.sortdir;

            strSQL += ";SELECT COUNT(*) AS Count FROM vwListStudents";
            using (SqlConnection connection = new SqlConnection(connectionStringName))
            {
                SqlCommand command = new SqlCommand(
                  strSQL, connection);

                connection.Open();

                SqlDataReader reader = command.ExecuteReader();

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        _Student.Add(new Student()
                        {
                            ID = Convert.ToInt32(reader["ID"].ToString()),
                            FirstName = reader["FirstName"].ToString(),
                            LastName = reader["LastName"].ToString(),
                            IsActive = Convert.ToBoolean(reader["IsActive"]),
                            StateName = reader["StateName"].ToString(),
                            CityName = reader["CityName"].ToString()
                        });
                    }
                }

                reader.NextResult();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        RowCount = Convert.ToInt32(reader["Count"].ToString());
                    }
                }

                reader.Close();
            }
            //RowCount = _Student.Count;
            return _Student;
        }
public class WebGridSampleController
{
    private StudentRepository _data;

    public WebGridSampleController()
    {
        _data = new StudentRepository();
    }

    public ActionResult Show1(StudentVm oSVm)
    {
        var students = _data.GetStudents(oSVm.page, oSVm.pageSize, oSVm.sort, oSVm.sortDir);
        oSVm.Students = students.ToList();
        return View(oSVm);
    }
}

public class StudentRepository
{
    public IEnumerable<Student> GetStudents(int page, int pageSize, string sort, string sortDir)
    {
        // Put the code that you have in StudentVM.GetAllStudents here
    }
}
public class StudentController
{
    private StudentRepository _data;

    public StudentController()
    {
        _data = new StudentRepository();
    }

    public ActionResult List(StudentListViewModel viewModel)
    {
        var students = _data.GetStudents(viewModel.Page, viewModel.PageSize, viewModel.Sort, viewModel.SortDirection);
        viewModel.Students = students.ToList();
        return View(viewModel);
    }
}

public class StudentRepository
{
    public IEnumerable<Student> GetStudents(int page, int pageSize, string sort, string sortDir)
    {
        // Put the code that you have in StudentVM.GetAllStudents here
    }
}