我找不到任何与Visual Studio 2017一起使用的更新答案。我已经被困了一天试图解决这个问题,我在网上找到的每个指南要么非常过时,要么是我尝试申请的任何内容。我的代码给了我无法解决的错误。我正在使用C#,HTML5,ASP.NET MVC5和VS2017
首先,我的控制器连接到SQL Server数据库:
public void GetStoredProc()
{
Exclusion objExclusion = new Exclusion();
string StrConnectionString = ConfigurationManager.ConnectionStrings["EligibilityContext"].ConnectionString;
SqlConnection sqlConnection1 = new SqlConnection(StrConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "[advantage].[GetAdvantageEligibilityDataOverride]";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConnection1;
sqlConnection1.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
int count = reader.FieldCount;
while (reader.Read())
{
if (count > 3)
{
int IntNum;
int.TryParse(reader.GetValue(0).ToString(), out IntNum);
objExclusion.PolicyNo = IntNum;
objExclusion.PolicyMod = (reader.GetValue(1).ToString());
objExclusion.InsuredName = (reader.GetValue(2).ToString());
objExclusion.ClientID = IntNum;
//Console.WriteLine(reader.GetValue(i));
}
}
}
// Data is accessible through the DataReader object here.
sqlConnection1.Close();
}
这是我的index.html
页面。我知道这里需要添加代码才能显示网页,但我是一个编程菜鸟,并且不知道究竟要放什么。
@model IEnumerable<Advantage_Exclusions_Eligibility.Models.Exclusion>
@{
ViewBag.Title = "Index";
}
<h2>AEE List</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<p>
</p>
<div>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.PolicyNo)
</th>
<th>
@Html.DisplayNameFor(model => model.PolicyMod)
</th>
<th>
@Html.DisplayNameFor(model => model.InsuredName)
</th>
<th>
@Html.DisplayNameFor(model => model.ClientID)
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.PolicyNo)
</td>
<td>
@Html.DisplayFor(modelItem => item.PolicyMod)
</td>
<td>
@Html.DisplayFor(modelItem => item.InsuredName)
</td>
<td>
@Html.DisplayFor(modelItem => item.ClientID)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.PolicyNo }) |
@Html.ActionLink("Details", "Details", new { id=item.PolicyNo }) |
@Html.ActionLink("Delete", "Delete", new { id=item.PolicyNo })
</td>
</tr>
}
</table>
<div class="pagination">
<nav id="AEEPagination" aria-label="Page navigation"
style="display:none;">
<ul class="pagination pagination-sm"></ul>
</nav>
</div>
</div>
非常感谢任何和所有帮助!
答案 0 :(得分:1)
您的方法public void GetStoredProc()
要么返回模型@model IEnumerable<Advantage_Exclusions_Eligibility.Models.Exclusion>
,要么将其作为参数,并使用存储过程的结果填充模型。
缩略示例可能如下所示:
// Your url, eg. /<controller>/exclusions
public ActionResult Exclusions()
{
var viewmodel = GetStoredProc();
// pass your IEnumerable<Exclusion> to the view
return View(viewmodel);
}
// Note the return type
public IEnumerable<Exclusion> GetStoredProc()
{
var exclusions = new List<Exclusion>();
// ... ...
if (reader.HasRows)
{
int count = reader.FieldCount;
while (reader.Read())
{
Exclusion objExclusion = new Exclusion(); // create a new exclusion for each row!
if (count > 3)
{
int IntNum;
int.TryParse(reader.GetValue(0).ToString(), out IntNum);
objExclusion.PolicyNo = IntNum;
objExclusion.PolicyMod = (reader.GetValue(1).ToString());
objExclusion.InsuredName = (reader.GetValue(2).ToString());
objExclusion.ClientID = IntNum;
exclusions.Add(objExclusion); // add the exclusion to your result set!
}
}
}
// Data is accessible through the DataReader object here.
sqlConnection1.Close();
return exclusions;
}
在您看来,您还需要进行一些调整。在这种情况下,您的model
是一个IEnumerable模型,因此在表头中没有使用model.PolicyNo
,model.PolicyMod
等。假设您的Exclusion
模型类已经设置了显示名称属性,您只需更改表格的标题即可使用集合中第一个Exclusion
模型的属性。
<th>
@Html.DisplayNameFor(model => model.First().PolicyNo)
</th>
<th>
@Html.DisplayNameFor(model => model.First().PolicyMod)
</th>
<th>
@Html.DisplayNameFor(model => model.First().InsuredName)
</th>
<th>
@Html.DisplayNameFor(model => model.First().ClientID)
</th>
<th></th>
我还建议在表格周围进行一些检查,以确保显示数据:
@if (model.Any()) {
// Show the table
<th>
@Html.DisplayNameFor(model => model.First().PolicyNo)
</th>
<th>
@Html.DisplayNameFor(model => model.First().PolicyMod)
</th>
// ...
}
附注,最好将SQL连接包装在using
中。我抓住了我能找到的第一个解释here。您甚至可以将SqlCommand
和SqlConnection
使用链接在一起:
例如
using (var conn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand())
{
// Use conn and cmd here.
}
答案 1 :(得分:0)
我之前使用过类似的代码。
首先在Controller中创建一个动作。然后使用ADO.net运行存储过程。
您可以使用SqlParameter[]
将参数传递到存储过程。
控制器代码:
public ActionResult MyResult()
{
string userid = User.Identity.GetUserId();
string constr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("My_Result", conn))
{
conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
DataSet ds = new DataSet();
SqlParameter[] prms = new SqlParameter[1];
prms[0] = new SqlParameter("@Userid", SqlDbType.VarChar, 500);
prms[0].Value = userid;
cmd.Parameters.AddRange(prms);
SqlDataAdapter ad = new SqlDataAdapter(cmd);
ad.Fill(ds);
conn.Close();
return View(ds);
}
}
}
通过此操作,将从存储过程中检索到的所有记录存储到DataSet中。现在返回视图以及数据集数据。
现在,在视图中,您需要将这些记录显示到表中。
查看代码
@using System.Data
@model DataSet
@{
ViewBag.Title = "MyResult";
}
<h2 style="text-align:center;">Result History</h2>
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<style>
table{
width:75%;
text-align:center;
}
th,td,tr{
border:1px solid black;
text-align:center;
padding:20px;
}
</style>
</head>
<body>
<table>
<tr>
<th>UserName</th>
<th>ExamDate</th>
<th>Score</th>
</tr>
@foreach (DataRow row in Model.Tables[0].Rows)
{
<tr>
<td>@row["UserName"]</td>
<td>@row["ExamDate"]</td>
<td>@row["Score"]</td>
</tr>
}
</table>
</body>
</html>
现在,从存储过程中检索到的所有数据都将显示在View的表中。
答案 2 :(得分:0)
我们还可以通过以下方式简化视图。
@using System.Data;
@model DataSet
<center>
<h2>Result History</h2>
<table class="table table-bordered table-responsive table-hover">
<tr>
<th>UserName</th>
<th>ExamDate</th>
<th>Result</th>
</tr>
@foreach(DataRow d in Model.Tables[0].Rows)
{
<tr>
<td>@d["UserName"]</td>
<td>@d["ExamDate"]</td>
<td>@d["Result"]</td>
</tr>
}
</table>
</center>`