【问题标题】:MVC passing array of classes to viewMVC 传递类数组来查看
【发布时间】:2023-04-06 09:44:01
【问题描述】:

我有一个正在 MS VS 2012 中工作的项目。我有一个类可以从数据库中提取数据并将其放入一个类数组中。这部分代码可以无缝运行。我遇到的问题是将数据获取到视图中进行显示。看来从控制器你应该有能力通过类,但我还没有找到它。

在模型中

    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 db 代码部分:

            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 对象数组。每个对象是数据库的一行。

【问题讨论】:

    标签: asp.net-mvc class view


    【解决方案1】:

    好的,所以我一直在玩它并意识到两件事,我在循环中犯了一个错误,我想通了。

    在 db 部分我更正了循环

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

    然后在控制器中我使用了 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();
            }
        }
    

    我意识到我需要修复我接下来会做的 else 部分

    然后在视图中

         @model BoxCheckInApp.Models.BoxInfo[]
    
         @{
            ViewBag.Title = "Boxes";
          }
    
          <h2>Boxes</h2>
    
    
          @foreach (BoxCheckInApp.Models.BoxInfo box in ViewBag.boxes)
          {
          <li>@box.BoxGUID</li>
          }
    

    显然,您需要将您调用的 @model 更改为数组才能使其工作,然后您必须调用命名空间。我没有在网上找到任何关于此的帮助,所以希望它会帮助其他人。

    【讨论】:

      【解决方案2】:

      关于模型,您的控制器和视图几乎就在那里。在这种情况下,您不需要 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[],您可以让 Razor 引擎知道 Model 属性中的类型。

      【讨论】:

      • 这个解决方案也很有效,在性能方面使用视图包比这个方法有什么缺点吗?
      • 性能,没有。它们都以控制器的ViewData 结尾。然而,可用性更好,因为模型是具体类型,而ViewBag 是动态的。 msdn.microsoft.com/en-us/library/…
      猜你喜欢
      • 2014-08-07
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      相关资源
      最近更新 更多