【问题标题】:Iterate Similar Records using foreach使用 foreach 迭代相似记录
【发布时间】:2019-11-05 12:07:24
【问题描述】:

我一直在尝试通过使用 @foreach() 来显示记录及其相关记录,但每次我不断收到错误“foreach 语句无法对类型的变量进行操作..”。 VS 解决方案基于 Code First 模型,此操作仅针对单个类。 任何有关相同的帮助和指导都会有所帮助:

模型:

public class SingleView //USSD
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string Client { get; set; }
    public string PolicyNo { get; set; }
    public Nullable<short> PolicyType { get; set; }
    public string InsurerName { get; set; }
    public Nullable<System.DateTime> RenewalDate { get; set; }
    public string Status { get; set; }
    public string Telephone { get; set; }
}

控制器

    public ActionResult Details(Int id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        SingleView singleView = db.SingleViews.Find(id);
        if (singleView == null)
        {
            return HttpNotFound();
        }
        return View(singleView);
    }

观点:

    @model  MinetSingleView.Models.SingleView
    @{

                    @foreach (var item in Model)
                    {
                        <tr>

                            <td>@Html.DisplayFor(model => model.Client)</td>
                            <td> @Html.DisplayFor(model => model.InsurerName)</td>
                            <td>Product Type</td>
                            <td>@Html.DisplayFor(model => model.PolicyType)</td>
                            <td>@Html.DisplayFor(model => model.RenewalDate)</td>
                            <td>@Html.DisplayFor(model => model.PolicyNo)</td>
                            <td>@Html.DisplayFor(model => model.Telephone)</td>
                            <td>@Html.DisplayFor(model => model.Status)</td>
                        </tr>
                    }
           }

详细信息部分使用自动增量“ID”作为 id 参数 例如本地主机:65129/Home/Details/16

【问题讨论】:

  • "及其相关记录" - 但是您的代码中没有任何内容表明“相关记录”,您查询单个记录 (.Find()) 并返回一个到视图,而不是多个。
  • 所以基本上 Find() 用于返回单个记录?我可以用什么来返回多个
  • 你使用.Where(r =&gt; r.SomeCondition)
  • 如果@model List 那么只需要迭代

标签: c# sql asp.net-mvc


【解决方案1】:

您的模型是一个单个对象,控制器的签名表明它应该只返回一个对象的数据 - 它需要一个 id Details(Int id)

您不需要foreach

考虑以下 sn-p。

var c = new SomeClass();

foreach( var item in c ) 
{
   What to iterate through here? 
}

返回多个对象的方法如下所示。

public ActionResult Details(sring clientName )
{
    if (string.IsNUllOrEmpty(clientName))
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    var svs = db.SingleViews.Where( sv => sv.Client == clientName).ToList();
    if (!svs.Any())
    {
        return HttpNotFound();
    }
    return View(svs);
}

此视图的Model 将是一个集合,然后您可以使用foreach

【讨论】:

    【解决方案2】:

    “foreach 语句不能对类型变量进行操作..”

    出现此错误是因为 foreach 语句只能对集合起作用。 您的 SingleView 不是一个集合。您可以通过实现GetEnumerator 使其可迭代

    无论如何,最简单的方法是将其转换为列表。

    并将列表传递给视图

    只需遵循 tymtams 示例即可。

    并在你的视图中添加这一行

     @model  List<MinetSingleView.Models.SingleView>
    

    【讨论】:

      【解决方案3】:

      控制器

        public ActionResult Details(Int id)
          {
              if (id == null)
              {
                  return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
              }
              List<SingleView> singleView = db.SingleViews.count > 0 ?
                                       db.SingleViews.where(a => a.id == id).tolist() : null ;
              if (singleView == null)
              {
                  return HttpNotFound();
              }
              return View(singleView);
          }
      
      

      查看

          @model  List<MinetSingleView.Models.SingleView>
          @{
      
                          @foreach (var item in Model)
                          {
                              <tr>
      
                                  <td>@Html.DisplayFor(model => model.Client)</td>
                                  <td> @Html.DisplayFor(model => model.InsurerName)</td>
                                  <td>Product Type</td>
                                  <td>@Html.DisplayFor(model => model.PolicyType)</td>
                                  <td>@Html.DisplayFor(model => model.RenewalDate)</td>
                                  <td>@Html.DisplayFor(model => model.PolicyNo)</td>
                                  <td>@Html.DisplayFor(model => model.Telephone)</td>
                                  <td>@Html.DisplayFor(model => model.Status)</td>
                              </tr>
                          }
                 }
      
      

      【讨论】:

      • 这在编译后 ;) 仍然需要将模型更改为集合。
      • @model Ienunerable 试试看
      • 你为什么不&amp;&amp; singleView.Count &gt; 0
      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2013-11-23
      相关资源
      最近更新 更多