Asp.net mvc 如何创建从存储过程访问数据的Razor MVC

Asp.net mvc 如何创建从存储过程访问数据的Razor MVC,asp.net-mvc,stored-procedures,razor,Asp.net Mvc,Stored Procedures,Razor,作为MVC的新手,我正在尝试获得一个有效的模型视图组件。唯一的限制是数据由C#类中的存储过程填充,PartialView使用Razor并存储在#共享文件夹中,以便所有页面都可以引用它 我认为可能有效的是ViewModel,BreadcrumbViewModel.cs: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq;

作为MVC的新手,我正在尝试获得一个有效的模型视图组件。唯一的限制是数据由C#类中的存储过程填充,PartialView使用Razor并存储在#共享文件夹中,以便所有页面都可以引用它

我认为可能有效的是ViewModel,BreadcrumbViewModel.cs:

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

namespace Web.Controllers.ViewModels
{
  public class BreadcrumbViewModel
  {
    public int Id { get; set; }
    public int ParentId { get; set; }
    public string Label { get; set; }
    public string URL { get; set; }
    public int SortOrder { get; set; }
    public int InverseDepth { get; set; }
  }

  public class BreadcrumbsViewModel
  {
    public List<BreadcrumbViewModel> getBreadcrumbModel(string thisURL)
    {
        //thisURL contains the path of the current page, so the stored proc can find its parents.
        List<BreadcrumbViewModel> listBVM = new List<BreadcrumbViewModel>();
        BreadcrumbViewModel model;
        string connString = System.Configuration.ConfigurationManager.ConnectionStrings["MyDataContext"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = conn;
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandText = "getBreadcrumb";
                cmd.Parameters.Add(new SqlParameter("@thisURL", SqlDbType.NVarChar));
                cmd.Parameters["@thisURL"].Value = thisURL;

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        model = new BreadcrumbViewModel
                        {
                            Id = Convert.ToInt32(reader[0]),
                            ParentId = Convert.ToInt32(reader[1]),
                            Label = reader[2].ToString(),
                            URL = reader[3].ToString(),
                            SortOrder = Convert.ToInt32(reader[4]),
                            InverseDepth = Convert.ToInt32(reader[5])
                        };
                        listBVM.Add(model);
                    }
                }
            }
        }
        if (listBVM == null)
        {
            model = new BreadcrumbViewModel
            {
                Id = 1,
                ParentId = 0,
                Label = "Home",
                URL = "/",
                SortOrder = 1,
                InverseDepth = 1
            };
            listBVM.Add(model);
        }
        return listBVM;
    }
  }
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Data.SqlClient;
使用System.Linq;
使用System.Web;
命名空间Web.Controllers.ViewModels
{
公共类面包屑视图模型
{
公共int Id{get;set;}
public int ParentId{get;set;}
公共字符串标签{get;set;}
公共字符串URL{get;set;}
公共int排序器{get;set;}
public int InverseDepth{get;set;}
}
公共类面包屑视图模型
{
公共列表getBreadcrumbModel(字符串thisURL)
{
//此URL包含当前页面的路径,因此存储的进程可以找到其父进程。
List listBVM=新列表();
面包屑模型;
string connString=System.Configuration.ConfigurationManager.ConnectionString[“MyDataContext”].ConnectionString;
使用(SqlConnection conn=newsqlconnection(connString))
{
conn.Open();
使用(SqlCommand cmd=new SqlCommand())
{
cmd.Connection=conn;
cmd.CommandType=System.Data.CommandType.StoredProcess;
cmd.CommandText=“getBreadcrumb”;
Add(新的SqlParameter(“@thisURL”,SqlDbType.NVarChar));
cmd.Parameters[“@thisURL”].Value=thisURL;
使用(SqlDataReader=cmd.ExecuteReader())
{
while(reader.Read())
{
模型=新面包屑视图模型
{
Id=Convert.ToInt32(读卡器[0]),
ParentId=Convert.ToInt32(读取器[1]),
Label=读取器[2]。ToString(),
URL=读取器[3]。ToString(),
SortOrder=Convert.ToInt32(读卡器[4]),
InverseDepth=Convert.ToInt32(读卡器[5])
};
listBVM.Add(模型);
}
}
}
}
if(listBVM==null)
{
模型=新面包屑视图模型
{
Id=1,
ParentId=0,
Label=“Home”,
URL=“/”,
SortOrder=1,
反向深度=1
};
listBVM.Add(模型);
}
返回列表BVM;
}
}
}

如果此ViewModel正确,那么引用列表的控制器和PartialView会是什么样子?

Viewmodels不应用于直接访问数据。控制器应该获取viewmodel的数据,甚至控制器也应该依赖于某些数据访问类

Viewmodels通常由保存数据字段的属性组成。他们不应该有任何行为,最重要的是,他们不应该访问数据库

我将首先隔离对另一个类的数据访问

public class BreadcrumbProvider
{
    public List<BreadcrumbViewModel> getBreadcrumbModel(string thisURL)
    {
        //your method
    }
}
然后可以在视图中将列表用作模型

@model System.Collections.Generic.List<BreadcrumbViewModel>

@model System.Collections.Generic.List

谢谢,这让我走得更远了。我在.cshtml文件中添加了@using Web.Controllers,并且能够让SDK接受[at]model System.Collections.Generic.List。如何使用[at]foreach循环遍历列表?它不喜欢[at]foreach(Breadcrumbs中的var breadcrumb){…}我也尝试过,但是breadcrumb不公开列表的字段属性,只公开getBreadcrumbModel。@ShoreShotWeb您确定在视图中使用了BreadcrumbViewModel吗?不是BreadcrumbsViewModel.model System.Collections.Generic.List[at]foreach(var breadcrumb in model){}它不喜欢breadcrumb.URL。我得到的唯一intellisense选项是Equals、getBreadcrumbs、GetHashCode、GetType、ToString。@ShoreShotWeb使用href=@breadcrumb.URL而不是Html.DisplayFor(),它在模型实例上工作,而不是在循环变量上。
@model System.Collections.Generic.List<BreadcrumbViewModel>