2016-06-30 53 views
2

我有一個項目,我在MS VS 2012年工作我有一個從數據庫中拉下的數據,並把它變成一個類數組類。代碼的這部分工作無縫。我遇到的問題是將數據傳送到視圖以供顯示。看起來從控制器你應該有能力通過類,但我還沒有找到它。類MVC傳球達陣,以查看

在模型

public Guid BoxGUID {get;set;} 
    [Required(ErrorMessage="A box number is required")] 
    public int BoxID { get; set; } 
    public DateTime Date { get; set; } 
    [Required(ErrorMessage="Please pick an option")] 
    public string BCAppearance { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string BCTrash { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string BCPad { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string BCClean { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string BCStrap { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string BCDoc { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string BCMaint { get; set; } 
    public string BCMaintNote { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string UBWrap { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string UBPiece { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string NPSec { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string NPDmg { get; set; } 
    [Required(ErrorMessage = "Please pick an option")] 
    public string NPHardware { get; set; } 
    public string TruckNum { get; set; } 
    public string Images { get; set; } 
    public int CompletedFlag { get; set; } 
    //odd items for manipulating data 
    public string curDate { get; set; } 
    public string boxGUIDString { get; set; } 

的int分貝代碼部分:

  public BoxInfo[] getBox(int count) 
    { 
     string query = "select * from Box where CompletedFlag = '0'"; 
     BoxInfo[] boxInfo = new BoxInfo[count]; 

     //create boxinfo array 
     SqlCommand cmd = new SqlCommand(query, oConn); 
     SqlDataReader rdr = cmd.ExecuteReader(); 
     while (rdr.Read()) 
     { 



      for (int i = 0; i < count; i++) 
      { 
       boxInfo[i] = new BoxInfo(); 
       // string test = rdr[0].ToString(); 
       boxInfo[i].BoxGUID = new Guid(rdr[0].ToString()); 
       boxInfo[i].BoxID = (int)rdr[1]; 
       boxInfo[i].Date = (DateTime)rdr[2]; 
       boxInfo[i].BCAppearance = rdr[3].ToString(); 
       boxInfo[i].BCTrash = rdr[4].ToString(); 
       boxInfo[i].BCPad = rdr[5].ToString(); 
       boxInfo[i].BCClean = rdr[6].ToString(); 
       boxInfo[i].BCStrap = rdr[7].ToString(); 
       boxInfo[i].BCDoc = rdr[8].ToString(); 
       boxInfo[i].BCMaint = rdr[9].ToString(); 
       boxInfo[i].BCMaintNote = rdr[10].ToString(); 
       boxInfo[i].UBWrap = rdr[11].ToString(); 
       boxInfo[i].UBPiece = rdr[12].ToString(); 
       boxInfo[i].NPSec = rdr[13].ToString(); 
       boxInfo[i].NPDmg = rdr[14].ToString(); 
       boxInfo[i].NPHardware = rdr[15].ToString(); 
       boxInfo[i].TruckNum = rdr[16].ToString(); 
       boxInfo[i].Images = rdr[17].ToString(); 
       boxInfo[i].CompletedFlag = 0; 
      } 

     } 
     return boxInfo; 
    } 

在控制器

namespace BoxCheckInApp.Controllers 
    { 
    public class AddBoxController : Controller 
    { 
    // 
    // GET: /AddBox/ 
    public CodeDB D = new CodeDB(); 
    public CodeODB O = new CodeODB(); 
    public BoxInfo box = new BoxInfo(); 


    public ActionResult Boxes() 
    { 
     D.Open(); 
     int count = D.getRows(); 

     if (count != 0) 
     { 
      BoxInfo[] myBoxes = new BoxInfo[count]; 
      myBoxes = D.getBox(count); 
      D.Close(); 


      return View(); 
     } 
     else 
     { 
      String noBoxes = "There are no incomlete boxes to edit"; 
      D.Close(); 
      return View(); 
     } 
    } 

在控制器我需要myBoxes傳遞給視圖。我的盒子是一個BoxInfo對象數組。每個對象都是數據庫的一行。

回答

0

你幾乎有你的控制器和關於模型視圖。在這種情況下,您不需要ViewBag

public ActionResult Boxes() { 
    D.Open(); 
    int count = D.getRows(); 

    if (count != 0) { 
     BoxInfo[] myBoxes = new BoxInfo[count]; 
     myBoxes = D.getBox(count); 
     D.Close(); 
     //just pass the model to the view. 
     return View(myBoxes); 
    } else { 
     String noBoxes = "There are no incomplete boxes to edit"; 
     D.Close(); 
     return View(); 
    } 
} 

一旦你的模型傳遞到認爲是所有你需要能夠設置@model後才能訪問它。您可以通過在視圖中調用Model屬性來獲取它。

@model BoxCheckInApp.Models.BoxInfo[] 
@{ 
    ViewBag.Title = "Boxes"; 
} 

<h2>Boxes</h2> 

@foreach (var @box in Model) { 
    <li>@box.BoxGUID</li> 
} 

通過指定@model BoxCheckInApp.Models.BoxInfo[]你讓剃刀引擎知道什麼是Model屬性的類型。

+0

這個解決方案工作爲好,沒有任何缺點在性能方面使用視圖包過這種方法嗎? – Danimal

+0

表現,沒有。它們都以控制器的'ViewData'結尾。然而,可用性更好,因爲Model是一個具體類型,而ViewBag是動態的。 https://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbase.viewbag(v=vs.118).aspx – Nkosi

0

好了,所以我一直在玩弄它一下,意識到兩件事情,我在環犯了一個錯誤,我想通了。

在DB部分

我在我用viewbag

 public ActionResult Boxes() 
    { 
     D.Open(); 
     int count = D.getRows(); 

     if (count != 0) 
     { 
      BoxInfo[] myBoxes = new BoxInfo[count]; 
      myBoxes = D.getBox(count); 
      D.Close(); 

      ViewBag.boxes = myBoxes; 
      return View(myBoxes); 
     } 
     else 
     { 
      String noBoxes = "There are no incomplete boxes to edit"; 
      D.Close(); 
      return View(); 
     } 
    } 

控制器我意識到我需要修復我的其他部分,我會做下一個

修正循環

 do 
      { 
       boxInfo[i] = new BoxInfo(); 
       boxInfo[i].BoxGUID = new Guid(rdr[0].ToString()); 
       boxInfo[i].BoxID = (int)rdr[1]; 
       boxInfo[i].Date = (DateTime)rdr[2]; 
       boxInfo[i].BCAppearance = rdr[3].ToString(); 
       boxInfo[i].BCTrash = rdr[4].ToString(); 
       boxInfo[i].BCPad = rdr[5].ToString(); 
       boxInfo[i].BCClean = rdr[6].ToString(); 
       boxInfo[i].BCStrap = rdr[7].ToString(); 
       boxInfo[i].BCDoc = rdr[8].ToString(); 
       boxInfo[i].BCMaint = rdr[9].ToString(); 
       boxInfo[i].BCMaintNote = rdr[10].ToString(); 
       boxInfo[i].UBWrap = rdr[11].ToString(); 
       boxInfo[i].UBPiece = rdr[12].ToString(); 
       boxInfo[i].NPSec = rdr[13].ToString(); 
       boxInfo[i].NPDmg = rdr[14].ToString(); 
       boxInfo[i].NPHardware = rdr[15].ToString(); 
       boxInfo[i].TruckNum = rdr[16].ToString(); 
       boxInfo[i].Images = rdr[17].ToString(); 
       boxInfo[i].CompletedFlag = 0; 
       i++; 
      } while (i < count - 1); 

然後

然後在視圖

 @model BoxCheckInApp.Models.BoxInfo[] 

    @{ 
     ViewBag.Title = "Boxes"; 
     } 

     <h2>Boxes</h2> 


     @foreach (BoxCheckInApp.Models.BoxInfo box in ViewBag.boxes) 
     { 
     <li>@box.BoxGUID</li> 
     } 

顯然,您需要將@model改爲數組才能工作,然後您必須調用命名空間。我在網上找不到任何幫助,所以希望它能幫助其他人。