如何在MVC视图中显示存储过程结果?

时间:2017-07-26 16:23:55

标签: c# html sql-server asp.net-mvc

我找不到任何与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>
&nbsp;</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>

非常感谢任何和所有帮助!

3 个答案:

答案 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.PolicyNomodel.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。您甚至可以将SqlCommandSqlConnection使用链接在一起:

例如

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的表中。

Output: Data displayed in a table

答案 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>`

The Output