2017-06-28 1 views
-1

Ich arbeite an einer Ansicht, die die Tabellendaten in einem Tabellenformat in mvc zeigt. Es zeigt einen Fehler, dass Model keine Definition für GetEnumerator enthält.foreach loop in mvc5 funktioniert nicht

MY VIEW

@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> 

mein 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); 
} 

MY DBHANDLE MODEL

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; 
} 

Ich weiß nicht, WHE Wenn ich falsch liege oder warum es nicht vom Modell zu meiner Ansicht abgerufen wird.

+2

Wenn Sie einen einzelnen 'testorder' an die Ansicht übergeben, keine Sammlung von' testorder', so erhalten Sie eine andere Ausnahme - [this one] (https://stackoverflow.com/questions/40373595/the- model-item-pass-in-the-dictionary-ist-of-type-but-this-dictionary-requ) - so haben Sie nicht einmal den richtigen Code angezeigt. Und Sie müssten "Model.searchtest" durchlaufen, was eine Sammlung ist, nicht "Model" –

+0

'@model TestComponents.Models.testorder' und' @foreach (var Artikel in Model.searchtest) {...} ' –

+0

Nein, Ihre 'seestest' Sammlung ist nur' List ', also ist es nur' @items '. Und Sie haben uns nicht gesagt, was 'sextestid' ist - aber es ist eine andere Eigenschaft von' testorder' (keine Eigenschaft von 'seestest') –

Antwort

0

Ihr Return-Modell ist nicht Sammlung, so dass Ihre Ansicht sein sollte:

Ich habe neues Modell mit Controller-Aktion und Methode Prüfung unter Code hinzugefügt wird es für Sie arbeitet.

Hier war das Problem in Ihrem Code, so habe ich ändern und in Sammlung Sammlung hinzugefügt: to.searchtest = dh.searchtes ('S', to);

ich ändern müssen, um dieses Modell unter Modell zu erstellen, da keine Notwendigkeit dieser Liste < string> Element jetzt:

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; 
     } 

Und hier sind wir für View Seite gehen:

@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> 

Definitiv wird dies dir helfen !!

Prost !!

0

Ihre Ansicht akzeptiert den Typ IEnumerable<TestComponents.Models.testorder> und in Ihrer Steuerung geben Sie die TestComponents.Models.testorder zurück. Es ist also ein Hauptproblem.

Eine andere Sache: Ich kann sehen, dass Sie Seetest und searchtestid in einer Tabelle anzeigen möchten. und aus dem Code kann ich davon ausgehen, dass Ihr Modell (testorder) wäre so etwas wie folgt

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

So suchen, können Sie Ihr Modell etwas umwandeln als

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

folgen und dann data kann wie folgt sein:

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; 
    } 

Und schließlich Ihre Controller sollte Ihr Modell etwas wie folgt machen:

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

Hope, das Ihnen hilft.