0

問題があります。データベースからデータを取得し、cshtml でグリッド形式で表示する必要があります。データは表示されていますが、エラーが表示されません。これが私のコードの外観です。

               BugTracker Model

      namespace Gridview_BugTracker.Models
         {
        public class BugTracker_DataHelper
           {
           public static List<BugTracker_DataHelper> GetList{get;set;}        
           public string projectName { get; set; }           
           public string Description { get; set; }
           public  string status { get; set; }           
            }

          ------------------------------
         BugTracker Controller


         public ActionResult Index()
    {
        Gridview_BugTracker.Models.BugTracker_DataHelper model = new BugTracker_DataHelper();
        SqlConnection conn = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BugTracker;Data Source=SSDEV6\SQLEXPRESS");
        conn.Open();
        SqlCommand dCmd = new SqlCommand("Select * from Projects", conn);
        SqlDataAdapter da = new SqlDataAdapter(dCmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        conn.Close();
        for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {
            model.projectName = ds.Tables[0].Rows[i]["projectName"].ToString();
            model.Description = ds.Tables[0].Rows[i]["Description"].ToString();
            model.status = ds.Tables[0].Rows[i]["Status"].ToString();
        }


        return View(model);
    }

        Index.Cshtml

       @model  IEnumerable<Gridview_BugTracker.Models.BugTracker_DataHelper>

       @{
       ViewBag.Title = "Index";
       }

      <h2>Index</h2>


       <p>
        @Html.ActionLink("Create New", "Create")
       </p>
      <table>
        <tr>
           <th>
              ProjectName
          </th>
       <th>
             Description     
       </th>
       <th>
           Status
       </th>    
    </tr>

   @foreach (var item in Model)
    {
       <tr>
         <td>
            @Html.DisplayFor(modelItem => item.projectName)
        </td>
      <td>
        @Html.DisplayFor(modelItem => item.Description)
      </td>
    <td>
        @Html.DisplayFor(modelItem => item.status)
    </td>

    <td>
        @Html.ActionLink("Edit", "Edit", new { id = item.projectName }) |
        @Html.ActionLink("Details", "Details", new { id = item.Description }) |
        @Html.ActionLink("Delete", "Delete", new { id = item.status })
       </td>
  </tr>
  }

プログラムを実行すると、このエラーが発生します

            error
     ----------------
       The model item passed into the dictionary is of type 'Gridview_BugTracker.Models.BugTracker_DataHelper',
but this dictionary requires a model item of type
'System.Collections.Generic.IEnumerable`1[Gridview_BugTracker.Models.BugTracker_DataHelper]'. 

だから、私が間違っているところを助けることができるか、それとも何かを追加する必要がありますか.....

4

2 に答える 2

1

ビューが BugTracker_DataHelper オブジェクトのリストを期待する BugTracker_DataHelpe オブジェクトのインスタンスを 1 つだけ返すためです。したがって、オブジェクトのリストをビューに返します。

必要に応じて複数の場所から呼び出すことができるように、データベース アクセス コードを別のメソッドに移動します。

public List<BugTracker_DataHelper> GetAllBugs()
{
    var modelList = new List<BugTracker_DataHelper>();
    using(SqlConnection conn = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BugTracker;Data Source=SSDEV6\SQLEXPRESS"))
    {
      conn.Open();
      SqlCommand dCmd = new SqlCommand("Select * from Projects", conn);
      SqlDataAdapter da = new SqlDataAdapter(dCmd);
      DataSet ds = new DataSet();
      da.Fill(ds);         
      for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
      {
        var model = new BugTracker_DataHelper();
        model.projectName = ds.Tables[0].Rows[i]["projectName"].ToString();
        model.Description = ds.Tables[0].Rows[i]["Description"].ToString();
        model.status = ds.Tables[0].Rows[i]["Status"].ToString();
        modelList.Add(model);
     }
    }
    return modelList;
}

アクションでこのメソッドを呼び出します

public ActionResult Index()
{
   var bugList=GetAllBugs();
   return View(bugList);    
}

さらにいくつかの提案も

1)コードに適切な例外処理を追加する

2)Select *をフォーマットに変更しSelect specific column nameます。

3)ToString() DataRow セル値の関数 (この例では) にアクセスして呼び出す前に、null をチェックします。

4)単に項目のリストを読み取る場合は、DataSet の代わりに DataReader を使用します

于 2012-07-12T14:26:45.237 に答える
0

これは、あなたが送信しGridview_BugTracker.Models.BugTracker_DataHelper、ビューがIEnumerable<Gridview_BugTracker.Models.BugTracker_DataHelper>

コントローラーのコードは次のようになります

public ActionResult Index()
    {
        List<Gridview_BugTracker.Models.BugTracker_DataHelper> model = new List<BugTracker_DataHelper>();
        SqlConnection conn = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BugTracker;Data Source=SSDEV6\SQLEXPRESS");
        conn.Open();
        SqlCommand dCmd = new SqlCommand("Select * from Projects", conn);
        SqlDataAdapter da = new SqlDataAdapter(dCmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        conn.Close();
        for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {
            Gridview_BugTracker.Models.BugTracker_DataHelper item = new BugTracker_DataHelper()
            item.projectName = ds.Tables[0].Rows[i]["projectName"].ToString();
            item.Description = ds.Tables[0].Rows[i]["Description"].ToString();
            item.status = ds.Tables[0].Rows[i]["Status"].ToString();

            model.add(item);
        }


        return View(model);
    }
于 2012-07-12T14:26:32.037 に答える