mvc5中的foreach循环不起作用

时间:2017-06-28 05:13:35

标签: c# html asp.net-mvc

我正在开发一个以mvc中的表格格式显示表格数据的视图。 它显示模型不包含GetEnumerator的定义的错误。

我的观点

@model IEnumerable<TestComponents.Models.testorder>   
<!DOCTYPE html>
<html>
<head>

</head>
<body>   
    <table id="myTable">
        <tr class="header">
            <th style="width:60%;">TEST NAME</th>
            <th style="width:40%;">TEST ID</th>
        </tr>

@foreach (var items in Model)
{
        <tr> 
            <td>@items.searchtest</td>
            <td>@items.searchtestid</td>
        </tr>
}
    </table>

MY CONTROLLER

public ActionResult test()
{
    testorder to = new testorder();
    DbHandle dh = new DbHandle();
    to.searchtest = dh.searchtes('S', to);
    to.searchtestid = dh.searchtesid('S', to);
    return View("test", to);
}

我的DBHANDLE模型

public List<string> searchtes(char flag, testorder to)
{
    List<string> items = new List<string>();
    connection();
    SqlCommand cmd = new SqlCommand("SPNAME", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@PstrOperationFlag", flag);
    cmd.Parameters.AddWithValue("@Pstrtestname", 'w');
    con.Open();
    SqlDataAdapter sd = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    sd.Fill(dt);
    using (SqlDataReader sdr = cmd.ExecuteReader())
    {
        while (sdr.Read())
        {
            items.Add(sdr["testname"].ToString());

        }
    }
    con.Close();
    return items;
}

我不知道我哪里出错了,或者为什么它没有从模型中检索到我的观点。

2 个答案:

答案 0 :(得分:0)

您的视图正在接受IEnumerable<TestComponents.Models.testorder>类型,并且在您的控制器中,您将返回TestComponents.Models.testorder。所以这是一个主要问题。

另一件事: 我可以看到你想在表格中显示searchtest和searchtestid。从你的代码我可以假设你的模型(测试顺序)看起来像下面的

public class testorder
    {
        public List<string> searchtest { get; set; }
        public List<string> searchtestid { get; set; }
    }

因此,您可以转换您的模型,如下所示

public class testorder
    {
        public string searchtest { get; set; }
        public string searchtestid { get; set; }
    }

然后您的 Datalayer 可以如下:

 public List<testorder> searchtes(char flag)
    {
        List<testorder> items = new List<testorder>;
        connection();
        SqlCommand cmd = new SqlCommand("SPNAME", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@PstrOperationFlag", flag);
        cmd.Parameters.AddWithValue("@Pstrtestname", 'w');
        con.Open();
        SqlDataAdapter sd = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        sd.Fill(dt);
        using (SqlDataReader sdr = cmd.ExecuteReader())
        {
            testorder to = new testorder();
            while (sdr.Read())
            {
                to = new testorder();
                to.searchtest = sdr["testname"].ToString();
                to.searchtestid = sdr["testid"].ToString();
                items.Add(to);

            }
        }
        con.Close();
        return items;
    }

最后,您的控制器应该为您的模型呈现如下内容:

public ActionResult test()
    {
        List<testorder> to = new List<testorder>();
        DbHandle dh = new DbHandle();
        to = dh.searchtes('S');        
        return View("test", to);
    }

希望,这对你有帮助。

答案 1 :(得分:0)

您的退货模型不是集合,因此您的观点应该是:

我添加了新模型,控制器操作和方法检查下面的代码,它将适合您。

以下是您的代码中的问题,因此我修改并添加到集合集合中: to.searchtest = dh.searchtes('S',to);

我已修改此模型以创建以下模型,因为不需要此列表&lt;字符串&gt; 元素现在:

    public partial class ItemModel
    {
        public virtual List<string> itemId { get; set; }
        public virtual List<string> itemName { get; set; }

    }

**So your new model should be :** 

        public partial class ItemModel
        {
            public virtual string itemId { get; set; }
            public virtual string itemName { get; set; }

        }

        And Your **Controller Action** should be :

        public ActionResult test()
        {
            ItemModel model = new ItemModel();
            List<ItemModel> itemList = new List<ItemModel>();
            testorder to = new testorder();
            DbHandle dh = new DbHandle();

            var itemmodel = dh.searchtes('S', to);

            //Second way if not work first way
            foreach (var itemvalue in itemmodel)
            {
                model.itemId = itemvalue.itemId;
                model.itemName = itemvalue.itemName;
                itemList.Add(model);
            }


            return View("test", itemList);
        }

        //your method should be 
        public List<ItemModel> searchtes(char flag, testorder to)
        {
            List<string> items = new List<string>();
            connection();
            SqlCommand cmd = new SqlCommand("SPNAME", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@PstrOperationFlag", flag);
            cmd.Parameters.AddWithValue("@Pstrtestname", 'w');
            con.Open();
            SqlDataAdapter sd = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            sd.Fill(dt);

            ItemModel item = new ItemModel();
            List<ItemModel> itemList = new List<ItemModel>();

            //item.itemId.Add(sdr["testId"].ToString());
            //item.itemName.Add(sdr["testname"].ToString());
            using (SqlDataReader sdr = cmd.ExecuteReader())
            {
                while (sdr.Read())
                {
                    item.itemId = sdr["testId"].ToString();
                    item.itemName = sdr["testname"].ToString();
                    itemList.Add(item);

                }
            }
            con.Close();
            return itemList;
        }

我们在这里查看页面:

@model IEnumerable<TestComponents.Models.ItemModel>  
<!DOCTYPE html>
<html>
<head>

</head>
<body>   
    <table id="myTable">
        <tr class="header">
            <th style="width:60%;">TEST NAME</th>
            <th style="width:40%;">TEST ID</th>
        </tr>

@foreach (var items in Model)
{
        <tr> 
            <td>@items.itemId</td>
            <td>@items.itemName</td>
        </tr>
}
    </table>

这肯定会帮助你!!

<强>干杯!!