MVC 4如何从控制器正确传递数据到视图

Ink*_*key 11 .net c# linq asp.net-mvc asp.net-mvc-4

我目前有一个带有LINQ语句的控制器,我将数据传递给我的视图.我试图找到一个更有效和更好的编码方法来做到这一点.我的家庭控制器声明如下.

Var Melt
  Furnace1 =
           (from item in db.tbl_dppITHr
           where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate
           select item).Sum(x => x.Furnace1Total),

ViewData["Furnace1Total"] = Melt.Furnace1;
Run Code Online (Sandbox Code Playgroud)

在我看来,我然后引用ViewData来显示这一点.运用

 @model dynamic
Run Code Online (Sandbox Code Playgroud)

现在我在Index方法中有很多linq语句.对于我正在做的每个人ViewData[]

我希望有人可以展示我如何将一个以上的var从控制器传递到一个没有ViewData或ViewBag方法的视图.我将如何在我的视图中访问此内容.

Dar*_*ren 11

您应该ViewModel使用所需的所有数据创建一个,然后将其传递给视图.

public class ViewModel 
{
   public List<int> Melt1 { get; set; }

   public void LoadMeltProperties() 
   {

       if (Melt1 == null) 
       {
          Melt1 = new List<int>();
       }

       Melt1 = (from item in db.tbl_dppITHr
       where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate
       select item).Sum(x => x.Furnace1Total).ToList();
   }

   public ViewModel Load()
   {
       LoadMeltProperties();
       return this;
   }
}

public ActionResult YourControllerAction() 
{
      var vm = new ViewModel().Load();
      return View("ViewName", vm);
}
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您可以使用strongly typed模型而不是dynamic

@model ViewModel
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式迭代ViewModel属性:

foreach(var melt in Model.Melt1) {
     // do what you require
}
Run Code Online (Sandbox Code Playgroud)


Sat*_*pal 6

恕我直言,你应该ViewModel使用它创建一个传递数据.

创建一个类

public class MyViewModel
{
    public <MeltFurnace1Type> MeltFurnace1{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在行动方法

public ActionResult Action() 
{
      MyViewModel vm = new MyViewModel();
      vm.MeltFurnace1 = something;
      return View("YourViewName", vm);
}
Run Code Online (Sandbox Code Playgroud)

在视图中

@model MyViewModel

//You can access your property using
Model.MeltFurnace1
Run Code Online (Sandbox Code Playgroud)