【问题标题】:Display List return from a controller to a table in view ASP.NET MVC4显示列表从控制器返回到视图 ASP.NET MVC4 中的表
【发布时间】:2015-04-17 22:50:09
【问题描述】:

我的控制器类中有一个函数,它返回一个数据列表,我想在我的视图页面中以表结构显示它。 我已经尝试了以下代码,但它显示了一些错误

“类不包含GetEnumerator的定义”

控制器

public ActionResult data(Message msg,IEnumerable<sample> dept)
{
    dbconnection db = new dbconnection();
    sample s = new sample();
    SqlConnection con = new SqlConnection(db.GetconString());
    DataTable dt;   
    List<examplemvc1.Models.sample> datatable = new List<sample>();
    dt = db.BuildDT("select * from MVCsample");
    foreach (DataRow row in dt.Rows)
    {
        s.FirstName = Convert.ToString(row["First Name"]);
        s.LastName = Convert.ToString(row["Last Name"]);
        s.Address = Convert.ToString(row["Address"]);
        s.PhoneNumber = Convert.ToString(row["PhoneNumber"]);
        s.Location = Convert.ToString(row["Location"]);
        datatable.Add(s);
        dept = datatable;  
    }
    ViewBag.tabledata = dept;
    return View(dept) ;
}

型号

public class sample
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string PhoneNumber { get; set; }
    public string Location { get; set; }
    public string tabledata { get; set; }
}

public class Message
{
    public IEnumerable<sample> sampleList { get; set; }
    public string MessageText { get; set; }
    public string MessageFrom { get; set; }
}

查看

@model examplemvc1.Models.sample

@foreach (var data in Model)
{
    <table><tr><td>@data.FirstName</td></tr></table>
}

更新 这就是我的整个视图的样子

@model List<examplemvc1.Models.sample>
@{
    ViewBag.Title = "Registration Form";
}
<head>
    <script type="text/javascript" src="../../Scripts/jquery-1.7.1.min.js"></script>
    <link href="../../Style/sample.css" rel="stylesheet" type="text/css" />
    <script src="../../Scripts/samplescript.js" type="text/javascript"></script>
</head>
<h2>
    Registration Form </h2>
   <body>

  <table>
 <tr>
 <th>
   First Name
 </th>
 </tr>

@foreach (var data in Model)
{
    <tr><td>@data.FirstName</td></tr>
}
</table>



@using (Html.BeginForm())
{

    <table id="table1">
    <tr>
         <td> 

             @Html.Label("Enter FirstName", new { @class = "standard_label_style" })
        </td>
         <td>
             @Html.TextBoxFor(a => a.FirstName, new { @class = "class1", title = "Enter FirstName", id = "NameBox", placeholder = "Enter name", onkeydown = "return TextField(event)" })
          <span class="errorMessage"></span>
           @if (!ViewData.ModelState.IsValid)
           {       
                <span class="field-validation-error">
                @ViewData.ModelState["FirstName"].Errors[0].ErrorMessage</span>
           }     
    </td>
    </tr>


    <tr>
    <td>
    @Html.Label("Enter LastName", new { @class = "standard_label_style" })
    </td>
    <td>

    @Html.TextBoxFor(a => a.LastName, new { @class = "class1", placeholder = "Enter name", id = "LastNameBox", title = "Enter Lastname", onkeydown = "return TextField(event); " })
        <span class="errorMessage"></span>
       </td>
    </tr>
    <tr>
    <td>
     @Html.Label("Enter Address", new { @class = "standard_label_style" })
     </td>
     <td>
      @Html.TextBoxFor(a => a.Address, new { @class = "class1", id = "AddressBox", placeholder = "Enter name", title = "Enter Address" })
    <span class="errorMessage"></span>
   </td>
    </tr>
    <tr>
   <td>
    @Html.Label("Enter PhoneNumber", new { @class = "standard_label_style" })
    </td>
    <td>
    @Html.TextBoxFor(a => a.PhoneNumber, new { @class = "class1", id = "PhoneBox", placeholder = "Enter name", title = "Enter Phonenumber", onkeydown = "return ValidateNumber(event);" })
    <span class="errorMessage"></span>
    </td>
  </tr>
  <tr>
  <td>
    @Html.Label("Enter Location", new { @class = "standard_label_style" })
    </td><td>
      @Html.TextBoxFor(a => a.Location, new { @class = "class1", id = "LocationBox", placeholder = "Enter name", title = "Enter Location" })
      <span class="errorMessage"></span>
      </td>
     </tr>
   </table>
    <input type="button" id="btnSave"  value="Register"/>
     <input type="button" value="Clear"/>
     <input type="button" id="Tabledata" value="Tabledata"/>
    <div id="div1"></div>

   @*@Html.ValidationSummary()*@








   <script type="text/javascript">

       function ValidateNumber(e) {
           var evt = (e) ? e : window.event;
           var charCode = (evt.keyCode) ? evt.keyCode : evt.which;
           if (charCode > 31 && (charCode < 48 || charCode > 57)) {
               return false;
           }
           return true;
       };
       function TextField(e) {
           var evt = (e) ? e : window.event;
           var charCode = (evt.keyCode) ? evt.keyCode : evt.which;
           if (charCode > 31 && (charCode < 48 || charCode > 56)) {
               return true;
           }
           else if (charCode == 8 || charCode == 9) {
               return true;
           }
           return false

       };


   </script>

}
   </body>

错误显示在我的视图代码中,实际上我不知道如何在视图页面中获取该值。我是mvc的新手。请帮我解决这个问题。任何帮助将不胜感激。

“更新”

我已经在 Stackoverflow 的帮助下解决了我的问题 下面是我的正确代码

控制器

 public ActionResult data()
        {
            SomeViewModel model = new SomeViewModel();
            dbconnection db = new dbconnection();
            SqlConnection con = new SqlConnection(db.GetconString());
            DataTable dt = db.BuildDT("select * from MVCsample");
            foreach (DataRow row in dt.Rows)
            {
                sample s = new sample();
                s.FirstName = Convert.ToString(row["First Name"]);
                s.LastName = Convert.ToString(row["Last Name"]);
                s.Address = Convert.ToString(row["Address"]);
                s.PhoneNumber = Convert.ToString(row["PhoneNumber"]);
                s.Location = Convert.ToString(row["Location"]);
                model.samples.Add(s);
            }
            return View(model);
        }

型号

namespace examplemvc1.Models
{
    public class sample
    {

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string Address { get; set; }


        public string PhoneNumber { get; set; }

        public string Location { get; set; }
         public string tabledata { get; set; }

    }
    public class Message
    {
        public IEnumerable<sample> sampleList { get; set; }
        public string MessageText { get; set; }
        public string MessageFrom { get; set; }
    }
    public class SomeViewModel
    {
        public SomeViewModel()
        {
            samples = new List<sample>();
            sample = new sample();
        }
        public List<sample> samples { get; set; }
        public sample sample { get; set; }
    }
}

查看

@model examplemvc1.Models.SomeViewModel

//…………

@foreach (var data in Model.samples)
{
    <tr><td>@data.FirstName</td>
     <td>@data.LastName</td>
     <td>@data.Address</td>
     <td>@data.PhoneNumber</td>
     <td>@data.Location</td></tr>
}
</table>

请看下面斯蒂芬·穆克的回答,他已经非常清楚地解释了上下文

【问题讨论】:

  • 您是否在页面开头指定了模型指令,例如model List&lt;namespace.sample&gt;
  • 显示您如何在视图中声明模型。但是您的代码中有多个其他错误(例如,每一行都有相同的值)
  • @JenishRabadiya ,是的,就像模型示例mvc1.Models.sample 一样
  • 列出 或 IEnumerable 是错误的。
  • @JenishRabadiya 好的,我会尝试

标签: asp.net-mvc asp.net-mvc-4 ienumerable


【解决方案1】:

您的视图正在显示sample 的列表以及似乎不是新sample 的表单。首先创建一个视图模型来表示您想要显示/编辑的内容

public class SampleVM
{
  public SampleVM
  {
      SampleCollection = new List<sample>
  }
  public List<sample> SampleCollection { get; set; }
  public sample NewSample { get; set; }
}

在你的控制器中修改代码为

public ActionResult data()
{
    SampleVM model = new SampleVM();
    dbconnection db = new dbconnection();
    SqlConnection con = new SqlConnection(db.GetconString());
    DataTable dt = db.BuildDT("select * from MVCsample");
    foreach (DataRow row in dt.Rows)
    {
        sample s = new sample();
        s.FirstName = Convert.ToString(row["First Name"]);
        s.LastName = Convert.ToString(row["Last Name"]);
        s.Address = Convert.ToString(row["Address"]);
        s.PhoneNumber = Convert.ToString(row["PhoneNumber"]);
        s.Location = Convert.ToString(row["Location"]);
        model.SampleCollection.Add(s);
    }
    return View(model);
}

注意事项:

  1. 从 GET 方法中删除参数。除了你 不要使用它们,因此它们毫无意义,即使您尝试使用它们 将这些对象传递给方法,绑定将失败并且 集合将为空(如果您要构建正确的 查询字符串使其工作,它会很长,几乎 当然会抛出异常)
  2. 您需要在foreach 循环内初始化一个新的sample (您的代码只初始化了一个对象,并且每个循环都更新了它的 属性到当前行,所以你最终会得到多个 同一个对象的引用,都匹配最后一个的值 行)
  3. 无需将模型作为ViewBag 属性传递(其 已经使用return View(model); 传递给视图

并将您的视图修改为

@model SampleVM
....
<table>
    @foreach(var sample in Model.SampleCollection)
        <tr>
            <td>@sample .FirstName</td>
        </tr>
    }
</table>
@Html.BeginForm())
{
  @Html.LabelFor(m => m.NewSample.FirstName, "Enter FirstName", new { @class = "standard_label_style" })
  @Html.TextBoxFor(m => m.NewSample.FirstName, @class = "class1", placeholder = "Enter name", title = "Enter Lastname")
  @Html.ValidationMessageFor(m => m.NewSample.FirstName)
}
....
<input type="submit" id="btnSave"  value="Register"/>

注意事项:

  1. 标签元素如果用于将元素与控件相关联。您的 用法会生成 &lt;label for="Enter_FirstName"&gt; 但您没有 用id="Enter_FirstName" 控制。最好你应该有 [Display(Name = "Enter FirstName")] 在属性上,但除此之外 使用强类型帮助器
  2. 使用@Html.ValidationMessageFor() 呈现ModelState 错误, 尽管在您的情况下,您的所有属性都是字符串,但您不是 有任何验证属性,所以永远不会有任何错误,所以 有点无意义
  3. html 助手生成一个id 属性。很少需要 覆盖它。停止用行为污染您的标记并学习 使用Unobtrusive Javascript
  4. 您的表单不包含提交按钮

【讨论】:

  • 我知道你已经等不及了!
  • 感谢您的帮助,我的问题已经解决了,+1 详细解释
  • 实际上,不,你没有,如果你花时间测试接受的答案,你就会知道它不起作用。
  • 可能是它有错误,我没有接受接受的答案,我和他聊天,我已经解决了我的问题,他正在帮助解决我在 stackoverflow 聊天中的问题,这就是为什么我已将其勾选为已接受的答案
  • 我不在乎你是否接受我的回答,但事实是你接受了一个不起作用的答案(顺便说一句,每次我发表评论时都会对其进行编辑)其他遇到此问题的人。
【解决方案2】:

问题是您的模型是 examplemvc1.Models.sample 类型,而您必须传递 List&lt;examplemvc1.Models.sample&gt; 的对象才能查看:

 return View(datatable) ;

你的行动:

List <examplemvc1.Models.sample> datatable = new List<sample>();

dt = db.BuildDT("select * from MVCsample");
    foreach (DataRow row in dt.Rows)
    {
       s.FirstName = Convert.ToString(row["First Name"]);
       s.LastName = Convert.ToString(row["Last Name"]);
       s.Address = Convert.ToString(row["Address"]);
       s.PhoneNumber = Convert.ToString(row["PhoneNumber"]);
       s.Location = Convert.ToString(row["Location"]);
       datatable.Add(s);
    }


    return View(datatable);  // passing list to view

并在视图中将模型设置为 List&lt;examplemvc1.Models.sample&gt;:

@model List<examplemvc1.Models.sample>

现在迭代你正在做的方式:

<table>
 <thead>
 <tr><th>First Name</th></tr>
 </thead>
 <tbody>
@foreach (var data in Model)
{
    <tr><td>@data.FirstName</td></tr>
}
</tbody>
</table>

【讨论】:

  • 我更改了代码,但它引发了错误 CS1061:'System.Collections.Generic.List' 不包含 'FirstName' 的定义并且没有扩展方法'可以找到接受“System.Collections.Generic.List”类型的第一个参数的 FirstName(您是否缺少 using 指令或程序集引用?)
  • 你确定你是按照我发布的方式做的吗?
  • 是的,我已经这样做了,按照您显示的方式更改模型声明
  • 是的,问题是我在代码中使用了一些文本框字段,并且将数据保存在模型参数中,因此当我将模型 examplemvc1.Models.sample 更改为模型 List它抛出错误
  • @ArunprasanthKV foreach 很好,问题在形式上,你不能那样做
【解决方案3】:

这里的问题在于你的模型指令。

应该是

@model IEnumerable<examplemvc1.Models.sample>

而不是

@model examplemvc1.Models.sample

注意:您正在像dept = datatable; 那样进行几次分配,而不是您可以像这样更新代码。

public ActionResult data(Message msg,IEnumerable<sample> dept)
    {

        dbconnection db = new dbconnection();
        sample s = new sample();
       SqlConnection con = new SqlConnection(db.GetconString());
        DataTable dt;

            List <examplemvc1.Models.sample> datatable = new List<sample>();

           dt = db.BuildDT("select * from MVCsample");
           foreach (DataRow row in dt.Rows)
           {
               s.FirstName = Convert.ToString(row["First Name"]);
               s.LastName = Convert.ToString(row["Last Name"]);
               s.Address = Convert.ToString(row["Address"]);
               s.PhoneNumber = Convert.ToString(row["PhoneNumber"]);
               s.Location = Convert.ToString(row["Location"]);
               datatable.Add(s);

              //dept = datatable;

           }
            ViewBag.tabledata = datatable;

            return View(datatable) ;
    }

更新 在这种情况下,您需要先创建视图模型并将其实例作为模型传递给那里。

public class SomeViewModel
{
    public SomeViewModel()
    {
        samples = new List<sample>();
        sample = new sample();
    }
    public List<sample> samples {get; set;}
    public sample sample {get; set;}
}

在模型声明中

@model namespace.SomeViewModel

然后在控制器中,如下所示。

public ActionResult data(Message msg,IEnumerable<sample> dept)
{
    dbconnection db = new dbconnection();
    sample s = new sample();
    SqlConnection con = new SqlConnection(db.GetconString());
    DataTable dt;   
    List<examplemvc1.Models.sample> datatable = new List<sample>();
    dt = db.BuildDT("select * from MVCsample");
    foreach (DataRow row in dt.Rows)
    {
        s.FirstName = Convert.ToString(row["First Name"]);
        s.LastName = Convert.ToString(row["Last Name"]);
        s.Address = Convert.ToString(row["Address"]);
        s.PhoneNumber = Convert.ToString(row["PhoneNumber"]);
        s.Location = Convert.ToString(row["Location"]);
        datatable.Add(s);
        dept = datatable;  
    }
    ViewBag.tabledata = dept;
    SomeViewModel vm = new SomeViewModel();
    vm.samples = datatable;
    vm.sample = //somesample instance here you want to edit.

    return View(vm) ;
}

在视图中,您将通过 vm.samples 获得 vm 的实例

@foreach (var data in Model.samples)
{
    <tr><td>@data.FirstName</td></tr>
}

在其余的视图中做这样的事情:

@Html.TextBoxFor(a => a.sample.FirstName, new { @class = "class1", title = 
"Enter FirstName", id = "NameBox", placeholder = "Enter name", onkeydown = 
"return TextField(event)" })

【讨论】:

  • CS1061:“System.Collections.Generic.List”不包含“FirstName”的定义,并且没有扩展方法“FirstName”接受“System”类型的第一个参数.Collections.Generic.List' 可以找到(您是否缺少 using 指令或程序集引用?)
  • 我进行了更改,旧错误消失了,现在它显示旧错误 foreach 语句无法对“examplemvc1.Models.sample”类型的变量进行操作,因为“examplemvc1.Models.sample”没有包含“GetEnumerator”的公共定义
  • @ArunprasanthKV 您现在可以查看。
  • @foreach (var data in Model.samples) 它显示错误,实际上 Models.samples 是什么?我没听懂
  • @ArunprasanthKV 它是一个包含少量样本对象的列表。错误是什么?您是否更新了模型指令?
猜你喜欢
  • 2012-12-12
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
相关资源
最近更新 更多