Asp.net mvc 如何创建从存储过程访问数据的Razor MVC
作为MVC的新手,我正在尝试获得一个有效的模型视图组件。唯一的限制是数据由C#类中的存储过程填充,PartialView使用Razor并存储在#共享文件夹中,以便所有页面都可以引用它 我认为可能有效的是ViewModel,BreadcrumbViewModel.cs: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;
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>