11

我目前有一个带有 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;

在我看来,我然后参考 ViewData 来显示这一点。使用

 @model dynamic

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

我希望有人可以展示我如何在没有 ViewData 或 ViewBag 方法的情况下将多个 var 从控制器传递到视图。以及我将如何在我看来访问此内容。

4

5 回答 5

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

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

@model ViewModel

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

foreach(var melt in Model.Melt1) {
     // do what you require
}
于 2013-09-04T08:06:53.677 回答
6

恕我直言,您应该使用它创建一个ViewModel通行证数据。

创建一个类

public class MyViewModel
{
    public <MeltFurnace1Type> MeltFurnace1{get;set;}
}

在行动方法

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

在视图中

@model MyViewModel

//You can access your property using
Model.MeltFurnace1
于 2013-09-04T08:09:26.833 回答
2

如果您需要实际从控制器传递数据,并且其数据取决于内部状态或输入控制器参数或具有“业务数据”的其他属性,则应使用MVC 模式中的模型部分:

模型对象是应用程序中实现应用程序数据域逻辑的部分。通常,模型对象检索模型状态并将其存储在数据库中。例如,Product 对象可能会从数据库中检索信息,对其进行操作,然后将更新的信息写回 SQL Server 数据库中的 Products 表。

您可以在此处查看详细信息或查看Microsoft 教程的 ASP.NET MVC 中的模型和验证部分。

  1. 添加模型类:

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string City { get; set; }
    }
    
  2. 将模型对象传递给视图:

    public ActionResult Index()
    {
        var model = GetModel();
        return View(model);
    }
    
  3. 通过定义模型类型添加强类型视图:

    @model Person
    
  4. 在您的视图中使用Model变量:

    @Model.City
    
于 2016-06-15T10:20:10.227 回答
1

改用模型

var Melt
 Furnace1 =
       (from item in db.tbl_dppITHr
       where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate
       select item).Sum(x => x.Furnace1Total),
return View("SomeVIew",MeltFurnace1)

在视图中@model "TypeOfMeltFurnace1"

您可以通过属性模型在视图中引用模型

于 2013-09-04T08:07:28.840 回答
0

如果有人还在寻找选择……</p>

如果您不为视图使用任何特定模型,您也可以将对象从控制器传递到视图。要将单个(或可能很少)参数从 Controller 传递给 View,您可以在 View() 方法中执行此操作。在控制器中:

public async Task<IActionResult> Update(int id)
{           
    return View(new { Id = id });            
}

然后在视图中,您可以像这样访问您的参数(假设您没有在视图中使用任何其他模型):

<div>
    @Html.ActionLink("Link name", "ControllerMethod", "ControllerName", new { id = (int)Model.Id })   
</div>

否则,就像已经提到的,在 View() 方法中传递你的模型。

于 2022-01-06T08:56:25.640 回答