【问题标题】:MVC 4 how pass data correctly from controller to viewMVC 4 如何正确地将数据从控制器传递到视图
【发布时间】:2013-09-07 15:25:13
【问题描述】:

我目前有一个带有 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 从控制器传递到视图。以及我将如何在我的视图中访问它。

【问题讨论】:

  • 将您的模型作为视图模型放入一个类中,然后将其传递给视图。

标签: c# .net asp.net-mvc linq asp.net-mvc-4


【解决方案1】:

您应该创建一个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
}

【讨论】:

  • 你没有错过foreach(var melt in Melt1)中的Model.吗?
  • 我创建了一个模型,因此我最好在模型中以新方法执行我的 LINQ 代码并从控制器调用它以传递给视图?
  • @Inkey - 是的。我为您创建了一个Load 方法。您可以将每个 LINQ 代码放入新方法中,然后在 Load 定义中调用这些方法,然后您的模型将自动获取新的属性/方法。
  • 最后一个问题我很抱歉。我正在使用 Entity FrameWork 并为我生成了模型类,所以所有的得到;放;为熔解表创建的属性。我需要创建一个新的模型类还是只在从实体框架创建的模型类中编写代码
  • @Inkey - 如果这对您来说更容易,您可以扩展现有的类。但是,我个人会将 EF 实体保存在一个单独的文件中(有点像 DTO 对象,然后是一个访问 EF 创建的对象的新 ViewModel)。这样你就有了一个纯数据访问层、业务逻辑层,然后是表示层的视图,还有更多n tier 架构。
【解决方案2】:

恕我直言,您应该使用它创建一个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

【讨论】:

    【解决方案3】:

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

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

    您可以查看详细信息 here 或查看 Microsoft 教程的 Models and Validation in 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. 通过定义模型类型添加strongly typed View

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

      @Model.City
      

    【讨论】:

      【解决方案4】:

      改用模型

      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"

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

      【讨论】:

        【解决方案5】:

        如果有人还在寻找选择……

        如果您不为视图使用任何特定模型,您也可以将对象从控制器传递到视图。要将单个(或可能很少)参数从 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() 方法中传递你的模型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-10
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多