【问题标题】:When should I use ViewBag/model?我什么时候应该使用 ViewBag/model?
【发布时间】:2015-06-13 16:06:42
【问题描述】:

我认为使用 ViewBag 比模型快。

我的例子是:

在行动中:

public ActionResult MyAction()
{
   ViewBag.Data = (from m in myDatabase.myTable select m).ToList();
}

在视图中:

@foreach(var item in ViewBag.Data)
{
   <tr>
      <td>@item.myColumn</td>
   </tr>
}

通过使用模型:

[Table("tbl_mytable")]
public class MyTable()
{
   public int Id { get; set; }
   public int Column2 { get; set; }
   public int Column3 { get; set; }
   // ...
   public IEnumerable<MyTable> Data { get; set; }
}

在模型中:

public class MainClass
{
   public List<MyTable> MyMethod()
   {
      List<MyTable> list = new List<MyTable>();
      // code logic to find data in database and add to list
      list.Add(new MyTable
      {
         Column2 = ...
         Column3 = ...
      });
      return list;
   }
}

在行动中:

public ActionResult MyAction()
{
   MainClass mc = new MainClass();
   MyTable model = new MyTable();
   model.Data = mc.MyMethod();
   return View(model);
}

在视图中:

@using MyProjectName.Models
@model MyProjectName.Models.MyTable

@foreach(MyTable item in Model.Data)
{
   <tr>
      <td>@item.Column1</td>
   </tr>
}

两者都在工作,ViewBag 比模型更容易。

那么,你能告诉我:我应该什么时候使用 ViewBag/model?

【问题讨论】:

标签: c# model asp.net-mvc-5 viewbag


【解决方案1】:

ViewBag 并不快。在这两种情况下,您都创建了List&lt;MyTable&gt; 的模型。您为创建“MyTable”模型而显示的所有代码都是毫无意义的 - 您只是创建一个包含现有集合中重复项的新集合。在控制器中它只需要是

public ActionResult MyAction()
{
  var model = (from m in myDatabase.myTable select m).ToList();
  return View(model);
}

在视图中

@model List<MyProjectName.Models.MyTable> // a using statement is not required when you use the fully qualified name
@foreach(var item in Model)
{
  <tr>
    <td>@item.myColumn</td>
  </tr>
}

除非您创建分层模型,否则您的 MyTable 模型不应具有属性 public IEnumerable&lt;MyTable&gt; Data { get; set; }

始终在您的视图中使用模型(最好是视图模型),以便您可以利用强类型(与 ViewBag 相比,dynamic

【讨论】:

  • 谢谢。你能告诉我更多吗?在您的示例中,如果我想在数据库中调用多个表,例如:var model1 = (from m in myDatabase.myTable1 select m).ToList();var model2 = (from n in myDatabase.myTable2 select n).ToList(); 返回哪里? return (???)
  • 我的意思是使用 ViewBag 更容易,就像:ViewBag.Model1 = (from m in myDatabase.myTable1 select m).ToList();ViewBag.Model2 = (from n in myDatabase.myTable2 select n).ToList();
  • 那么正确的做法是使用视图模型。它可以包含 2 个属性 List&lt;myTable1&gt; Table1 { get; set; }List&lt;myTable1&gt; Table2 { get; set; },然后在视图中,var model = new MyViewModel() { Table1 = (from m in myDatabase.myTable1 select m).ToList(), Table2 = (from n in myDatabase.myTable2 select n).ToList(); }; 并将模型返回到视图。
【解决方案2】:

如果您想将强类型的消息添加到您的视图模型,请使用模型。否则,坚持使用 ViewBag。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2012-09-22
    • 1970-01-01
    • 2012-12-23
    • 2021-07-13
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多